#include "main.h"
#include "bmp2map.h"

//--------------------------------------------------
//
//--------------------------------------------------
void CoastBMP()
{
int x,y,A,B;
int z=2;
liste*neu;


	for(x=max(2,MinX); x<min(XBORDER-1,MaxX); x++)
		for(y=max(2,MinY); y<min(YBORDER-1,MaxY); y++)
		{
			neu=b_liste;
			while(neu->next!=NULL)
			{
				A=neu->BMPID;
				B=neu->next->BMPID;
				if(BMPID[x][y] == A)
				{
					//Seiten
					if(BMPID[x][y-z]!=A && BMPID[x-1][y]==A && BMPID[x+1][y]==A) tmp[x][y]=B;
					if(BMPID[x][y+z]!=A && BMPID[x-1][y]==A && BMPID[x+1][y]==A) tmp[x][y]=B;
					if(BMPID[x+z][y]!=A && BMPID[x][y-1]==A && BMPID[x][y+1]==A) tmp[x][y]=B;
					if(BMPID[x-z][y]!=A && BMPID[x][y-1]==A && BMPID[x][y+1]==A) tmp[x][y]=B;
					//Kanten
					if(BMPID[x+z][y-z]!=A && BMPID[x+1][y]==A && BMPID[x][y-1]==A) tmp[x][y]=B;
					if(BMPID[x-z][y-z]!=A && BMPID[x-1][y]==A && BMPID[x][y-1]==A) tmp[x][y]=B;
					if(BMPID[x-z][y+z]!=A && BMPID[x-1][y]==A && BMPID[x][y+1]==A) tmp[x][y]=B;
					if(BMPID[x+z][y+z]!=A && BMPID[x+1][y]==A && BMPID[x][y+1]==A) tmp[x][y]=B;
					//ECKEN
					if(BMPID[x+z][y]!=A && BMPID[x][y-z]!=A) tmp[x][y]=B;
					if(BMPID[x-z][y]!=A && BMPID[x][y-z]!=A) tmp[x][y]=B;
					if(BMPID[x-z][y]!=A && BMPID[x][y+z]!=A) tmp[x][y]=B;
					if(BMPID[x+z][y]!=A && BMPID[x][y+z]!=A) tmp[x][y]=B;
				}
				neu=neu->next->next;
			}
		}
	for(x=max(2,MinX); x<min(XBORDER-1,MaxX); x++)
		for(y=max(2,MinY); y<min(YBORDER-1,MaxY); y++)
			if(tmp[x][y]!=0)
				BMPID[x][y]=tmp[x][y];
}



//--------------------------------------------------
//
//--------------------------------------------------
void MakeCoast(int x, int y)
{
coast*neu;

	neu=a_coast;

	while( neu->next!=NULL )
	{
		MakeCoastCheck(x, y, neu);
		neu=neu->next;
	}
}


//--------------------------------------------------
//
//--------------------------------------------------
void MakeCoastCheck(int x, int y, coast *neu)
{
int A=neu->color_a;
farbe *farbeB;
int B;
int ID=0, zlev=0;
int off=0;
additem *tmp_additem;
liste *coastliste;

	farbeB=neu->color_b;
	
	while( farbeB != NULL )
	{
		B = farbeB->color;

		if(BMPID[x][y] == A)
		{
			//  L 
			// WxW
			if(BMPID[x][y-1]==B && BMPID[x-1][y]==A && BMPID[x+1][y]==A)
			{
				if( neu->side[2][1]==0 )
					MapID[x][y]=neu->side[2][0];
				else MapID[x][y]=neu->side[2][RandomNum(0,1)];
				if( neu->item[2][1]==0 )
					ID=neu->item[2][0];
				else ID=neu->item[2][RandomNum(0,1)];
				if ( neu->spezial != 2 )
					MapAlt[x][y]=RandomNum(-4, 2);
				MapOcc[x][y]=1;
			}
			// WxW
			//  L 
			if(BMPID[x][y+1]==B && BMPID[x-1][y]==A && BMPID[x+1][y]==A)
			{
				if( neu->side[0][1]==0 )
					MapID[x][y]=neu->side[0][0];
				else MapID[x][y]=neu->side[0][RandomNum(0,1)];
				if( neu->side[0][1]==0 )
					ID=neu->item[0][0];
				else ID=neu->item[0][RandomNum(0,1)];
				MapAlt[x][y]=-15;
			}
			// W
			// xL 
			// W
			if(BMPID[x+1][y]==B && BMPID[x][y-1]==A && BMPID[x][y+1]==A)
			{
				if( neu->side[3][1]==0 )
					MapID[x][y]=neu->side[3][0];
				else MapID[x][y]=neu->side[3][RandomNum(0,1)];
				if( neu->item[3][1]==0 )
					ID=neu->item[3][0];
				else ID=neu->item[3][RandomNum(0,1)];
				MapAlt[x][y]=-15;

			}
			//  W
			// Lx
			//  W
			if(BMPID[x-1][y]==B && BMPID[x][y-1]==A && BMPID[x][y+1]==A)
			{
				if( neu->side[1][1]==0 )
					MapID[x][y]=neu->side[1][0];
				else MapID[x][y]=neu->side[1][RandomNum(0,1)];
				if( neu->item[1][1]==0 )
					ID=neu->item[1][0];
				else ID=neu->item[1][RandomNum(0,1)];
				if ( neu->spezial != 2 )
					MapAlt[x][y]=RandomNum(-4, 2);
				MapOcc[x][y]=1;
			}

			//Kanten
			// WL
			// xW
			if(BMPID[x+1][y-1]==B && BMPID[x+1][y]==A && BMPID[x][y-1]==A)
			{
				if( neu->side[7][1]==0 )
					MapID[x][y]=neu->side[7][0];
				else MapID[x][y]=neu->side[7][RandomNum(0,1)];
				if( neu->item[7][1]==0 )
					ID=neu->item[7][0];
				else ID=neu->item[7][RandomNum(0,1)];
				MapAlt[x][y]=-15;
			}
			// LW
			// Wx
			if(BMPID[x-1][y-1]==B && BMPID[x-1][y]==A && BMPID[x][y-1]==A)
			{
				if( neu->side[6][1]==0 )
					MapID[x][y]=neu->side[6][0];
				else MapID[x][y]=neu->side[6][RandomNum(0,1)];
				if( neu->item[6][1]==0 )
					ID=neu->item[6][0];
				else ID=neu->item[6][RandomNum(0,1)];
				if ( neu->spezial != 2 )
					MapAlt[x][y]=RandomNum(-2, 2);
				MapOcc[x][y]=1;
			}
			// Wx
			// LW
			if(BMPID[x-1][y+1]==B && BMPID[x-1][y]==A && BMPID[x][y+1]==A)
			{
				if( neu->side[5][1]==0 )
					MapID[x][y]=neu->side[5][0];
				else MapID[x][y]=neu->side[5][RandomNum(0,1)];
				if( neu->item[5][1]==0 )
					ID=neu->item[5][0];
				else ID=neu->item[5][RandomNum(0,1)];
				MapAlt[x][y]=-15;
			}
			// xW
			// WL
			if(BMPID[x+1][y+1]==B && BMPID[x+1][y]==A && BMPID[x][y+1]==A)
			{
				if( neu->side[4][1]==0 )
					MapID[x][y]=neu->side[4][0];
				else MapID[x][y]=neu->side[4][RandomNum(0,1)];
				if( neu->item[4][1]==0 )
					ID=neu->item[4][0];
				else ID=neu->item[4][RandomNum(0,1)];
				MapAlt[x][y]=-15;
			}
			//Ecken
			// LL
			// xL
			if(BMPID[x+1][y-1]==B && BMPID[x+1][y]==B && BMPID[x][y-1]==B)
			{
				if( neu->side[11][1]==0 )
					MapID[x][y]=neu->side[11][0];
				else MapID[x][y]=neu->side[11][RandomNum(0,1)];
				if( neu->item[11][1]==0 )
					ID=neu->item[11][0];
				else ID=neu->item[11][RandomNum(0,1)];
				if ( neu->spezial != 2 )
					MapAlt[x][y]=RandomNum(-3, 0);
				MapOcc[x][y]=1;
			}
			// LL
			// Lx
			if(BMPID[x-1][y-1]==B && BMPID[x-1][y]==B && BMPID[x][y-1]==B)
			{
				if( neu->side[10][1]==0 )
					MapID[x][y]=neu->side[10][0];
				else MapID[x][y]=neu->side[10][RandomNum(0,1)];
				if( neu->item[10][1]==0 )
					ID=neu->item[10][0];
				else ID=neu->item[10][RandomNum(0,1)];
				if ( neu->spezial != 2 )
					MapAlt[x][y]=RandomNum(-3, 0);
				MapOcc[x][y]=1;
			}
			// Lx
			// LL
			if(BMPID[x-1][y+1]==B && BMPID[x-1][y]==B && BMPID[x][y+1]==B)
			{
				if( neu->side[9][1]==0 )
					MapID[x][y]=neu->side[9][0];
				else MapID[x][y]=neu->side[9][RandomNum(0,1)];
				if( neu->item[9][1]==0 )
					ID=neu->item[9][0];
				else ID=neu->item[9][RandomNum(0,1)];
				if ( neu->spezial != 2 )
					MapAlt[x][y]=RandomNum(-3, 0);
				MapOcc[x][y]=1;
			}
			// xL
			// LL
			if(BMPID[x+1][y+1]==B && BMPID[x+1][y]==B && BMPID[x][y+1]==B)
			{	
				if( neu->side[8][1]==0 )
					MapID[x][y]=neu->side[8][0];
				else MapID[x][y]=neu->side[8][RandomNum(0,1)];
				if( neu->item[8][1]==0 )
					ID=neu->item[8][0];
				else ID=neu->item[8][RandomNum(0,1)];
				MapAlt[x][y]=-9;
			}
			if(ID!=0)
			{
				off = neu->spezial;
				if ( off > 1 )
					off = 1;
				Add[x+off][y+off]=(additem*)malloc(sizeof(additem));
				Add[x+off][y+off]->next=(additem*)malloc(sizeof(additem));
				Add[x+off][y+off]->ID=ID;
				coastliste=b_liste;
				while( coastliste->next!=NULL )
				{
					if(A == coastliste->BMPID)	
					{	
						Add[x+off][y+off]->zlev= BMPZ[x+off][y+off]+zlev;		// Zuweisung der Coastitemshöhe über die Farbe
						break;
					}
					zlev=RandomNum(coastliste->low,coastliste->high);			// Speichern der Küstenhöhe, da immer Reihenfolge Coast, Land;
					coastliste = coastliste->next;								// und bei Land wird == gefunden
				}
				tmp_additem=Add[x+off][y+off];
				tmp_additem=tmp_additem->next;
				tmp_additem->next=NULL;
			}
		}

		farbeB = farbeB->next;
	}
}



//--------------------------------------------------
//
//--------------------------------------------------
void MakeCliffs(int x, int y)
{
cliff*neu;
farbe*farbe_a;
farbe*farbe_b;
int color_a,color_b;

	if(BMPID[x][y] != COLOR_CLFF) return;				//Kliff-Farbe?
	MapAlt[x][y] = 0;									//Höhe "korrigieren". Alles andere erfordert das mapz.bmp

	
	//**********************
	//*       Seiten       *
	//**********************

	//  ? 
	// CXC
	//  ? 
	if(BMPID[x-1][y] == COLOR_CLFF && BMPID[x+1][y] == COLOR_CLFF)
	{
		neu=a_cliff[0];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x][y-1]==color_a && BMPID[x][y+1]==color_b ) 
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}
	}

	//  C
	// ?X?
	//  C
	if(BMPID[x][y-1] == COLOR_CLFF && BMPID[x][y+1] == COLOR_CLFF)
	{
		neu=a_cliff[1];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x-1][y]==color_a && BMPID[x+1][y]==color_b ) 
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}
	}


	//**********************
	//* Anfang und Ende    *
	//**********************

	//  ! 
	// ?X?
	//  C
	if(BMPID[x][y+1] == COLOR_CLFF && BMPID[x][y-1] != COLOR_CLFF)
	{
		MapID[x][y] = defcliff1;							//DefaultID
		neu=a_cliff[2];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x-1][y]==color_a && BMPID[x+1][y]==color_b ) 
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}
	}

	//  ? 
	// CX!
	//  ?
	if(BMPID[x-1][y] == COLOR_CLFF && BMPID[x+1][y] != COLOR_CLFF)
	{
		MapID[x][y] = defcliff2;
		neu=a_cliff[3];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x][y-1]==color_a && BMPID[x][y+1]==color_b ) 
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}
	}


	//  C 
	// ?X?
	//  !
	if(BMPID[x][y-1] == COLOR_CLFF && BMPID[x][y+1] != COLOR_CLFF)
	{
		neu=a_cliff[4];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x-1][y]==color_a && BMPID[x+1][y]==color_b ) 
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}

	}


	//  ? 
	// !XC
	//  ?
	if(BMPID[x+1][y] == COLOR_CLFF && BMPID[x-1][y] != COLOR_CLFF)
	{
		MapID[x][y] = defcliff2;
		neu=a_cliff[5];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x][y-1]==color_a && BMPID[x][y+1]==color_b ) 
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}
	}

	//**********************
	//* Rundungen          *
	//**********************

	//  C 
	// CX
	//   ?
	if(BMPID[x-1][y] == COLOR_CLFF && BMPID[x][y-1] == COLOR_CLFF)
	{
		MapID[x][y] = defcliff3;
		neu=a_cliff[6];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x+1][y+1]==color_a )
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}
	}

	//  C 
	//  XC
	// ?
	if(BMPID[x+1][y] == COLOR_CLFF && BMPID[x][y-1] == COLOR_CLFF)
	{
		MapID[x][y] = defcliff2;
		neu=a_cliff[7];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x-1][y+1]==color_a )
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}
	}

	// ? 
	//  XC
	//  C
	if(BMPID[x+1][y] == COLOR_CLFF && BMPID[x][y+1] == COLOR_CLFF)
	{
		MapID[x][y] = defcliff2;
		neu=a_cliff[8];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x-1][y-1]==color_a )
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}
	}

	//   ?
	// CX
	//  C
	if(BMPID[x-1][y] == COLOR_CLFF && BMPID[x][y+1] == COLOR_CLFF)
	{
		MapID[x][y] = defcliff2;
		neu=a_cliff[9];

		while( neu->next!=NULL )
		{
			farbe_a = neu->color_a;
			while( farbe_a != NULL )
			{
				color_a = farbe_a->color;
				farbe_b = neu->color_b;

				while( farbe_b != NULL )
				{
					color_b = farbe_b->color;

					if( BMPID[x+1][y-1]==color_a )
					{
						if( neu->ID[2]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,2)]; break; }
						if( neu->ID[1]!=0 ){ MapID[x][y]=neu->ID[RandomNum(0,1)]; break; }
						if( neu->ID[1]==0 && neu->ID[2]==0 ){ MapID[x][y]=neu->ID[0]; break; }
					}

					farbe_b = farbe_b->next;
				}

				farbe_a = farbe_a->next;
			}
			neu=neu->next;
		}
	}
}


