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






//--------------------------------------------------
//
//--------------------------------------------------
void SmoothItem(int x, int y)
{
smooth*neu;

	neu=i_smooth;

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


//--------------------------------------------------
//
//--------------------------------------------------
void SmoothItemCheck(int x, int y, smooth *neu)
{
int special = 0;
int A;
int zlev=0;
int buf = 0;
additem *tmp_additem;
liste *coastliste;
farbe*farbe1 = neu->color_a;
	
	while( farbe1 != NULL )
	{
		A = farbe1->color;	

		if(BMPID[x][y]==A && Add[x][y]==NULL && MapOcc[x][y]==0)
		{	
			Add[x][y]=(additem*)malloc(sizeof(additem));
			Add[x][y]->next=(additem*)malloc(sizeof(additem));
			tmp_additem=Add[x][y];
			tmp_additem->ID = 0;

			//KANTEN
 			//GB
			//xG
			if(BMPID[x+1][y-1]!=A)
			{
				if(neu->side[7][1]==0)
					tmp_additem->ID=neu->side[7][0];
				else tmp_additem->ID=neu->side[7][RandomNum(0,1)];	
			}
			//BG
			//Gx
			if(BMPID[x-1][y-1]!=A)
			{
				if(neu->side[6][1]==0)
					tmp_additem->ID=neu->side[6][0];
				else tmp_additem->ID=neu->side[6][RandomNum(0,1)];
			}
			//Gx
			//BG
			if(BMPID[x-1][y+1]!=A)
			{
				if(neu->side[5][1]==0)
					tmp_additem->ID=neu->side[5][0];
				else tmp_additem->ID=neu->side[5][RandomNum(0,1)];
			}
			//xG
			//GB
			if(BMPID[x+1][y+1]!=A)
			{
				if(neu->side[4][1]==0)
					tmp_additem->ID=neu->side[4][0];
				else tmp_additem->ID=neu->side[4][RandomNum(0,1)];
			}
	
			//SEITEN
			// B 
			//GxG
			if(BMPID[x][y-1]!=A)
			{
				if(neu->side[2][1]==0)
					tmp_additem->ID=neu->side[2][0];
				else tmp_additem->ID=neu->side[2][RandomNum(0,1)];
			}
			//GxG
			// B 
			if(BMPID[x][y+1]!=A)
			{
				if(neu->side[0][1]==0)
					tmp_additem->ID=neu->side[0][0];
				else tmp_additem->ID=neu->side[0][RandomNum(0,1)];
			}
			//G
			//xB 
			//G
			if(BMPID[x+1][y]!=A) 
			{
				if(neu->side[3][1]==0)
					tmp_additem->ID=neu->side[3][0];
				else tmp_additem->ID=neu->side[3][RandomNum(0,1)];
			}
			// G
			//Bx 
			// G
			if(BMPID[x-1][y]!=A)
			{
				if(neu->side[1][1]==0)
					tmp_additem->ID=neu->side[1][0];
				else tmp_additem->ID=neu->side[1][RandomNum(0,1)];
			}
	
			//ECKEN
			//B
			//xB
			if(BMPID[x+1][y]!=A && BMPID[x][y-1]!=A)
			{
				if(neu->side[11][1]==0)
					tmp_additem->ID=neu->side[11][0];
				else tmp_additem->ID=neu->side[11][RandomNum(0,1)];
			}
			// B	
			//Bx
			if(BMPID[x-1][y]!=A && BMPID[x][y-1]!=A)
			{
				if(neu->side[10][1]==0)
					tmp_additem->ID=neu->side[10][0];
				else tmp_additem->ID=neu->side[10][RandomNum(0,1)];
			}
			//Bx
			// B
			if(BMPID[x-1][y]!=A && BMPID[x][y+1]!=A)
			{
				if(neu->side[9][1]==0)
					tmp_additem->ID=neu->side[9][0];
				else tmp_additem->ID=neu->side[9][RandomNum(0,1)];
			}
			//xB	
			//B
			if(BMPID[x+1][y]!=A && BMPID[x][y+1]!=A) 
			{
				if(neu->side[8][1]==0)
					tmp_additem->ID=neu->side[8][0];
				else tmp_additem->ID=neu->side[8][RandomNum(0,1)];
			}

			if( tmp_additem->ID == 0 )
				tmp_additem->ID = neu->side[5][0];

			coastliste=b_liste;
			while( coastliste->next!=NULL )
			{
				if(coastliste->BMPID==A)
				{	
					tmp_additem->zlev= BMPZ[x][y]+zlev;
					break;
				}
				zlev=RandomNum(coastliste->low,coastliste->high);
				if( buf == 1 )
					tmp_additem->ID = RandomID( coastliste->MAPID );
				coastliste = coastliste->next;
			}
			tmp_additem=tmp_additem->next;
			tmp_additem->next=NULL;
		}

		farbe1 = farbe1->next;
	}
}



//--------------------------------------------------
//
//--------------------------------------------------
void SetItem( int p )
{
int x,y,z,isfirstitem;
int rand;
color_item	*tmp_color;													// temporäre Zeiger auf die Teillisten
item		*tmp_item;
freq_item	*tmp_freq;
additem		*tmp_additem;
item		*firstitem;

	for(x=MinX; x<MaxX; x++)
		for(y=MinY; y<MaxY; y++)
		{
			if(MapOcc[x][y]==0)											// auf Smooth testen
			{
				tmp_color=a_color_item;
				while( tmp_color->next!=NULL )
				{
					if( BMPID[x][y]==tmp_color->color )
					{
						rand = RandomNum(0,p);
						tmp_freq=tmp_color->a_freq_item;
						while( tmp_freq->next!=0)
						{
							rand = rand - tmp_freq->freq;
							if( rand <= 0 )		// prozentuale Verteilung
							{
								tmp_item=tmp_freq->a_item;
								if( tmp_item->next!=0 )
								{
									z = tmp_item->zlev;
									isfirstitem = 1;
									firstitem = tmp_item;
								}

								while( tmp_item->next!=0)
								{	
									if(Add[x+tmp_item->xmove][y+tmp_item->ymove]==NULL)			// test ob schon Elemente in Liste
									{
										Add[x+tmp_item->xmove][y+tmp_item->ymove]=(additem*)malloc(sizeof(additem));	// x-Move und y, eingerechnet,
										tmp_additem=Add[x+tmp_item->xmove][y+tmp_item->ymove];							// dadurch neue Listenanfänge möglich
									}
									else														// else=initialisierte Liste
									{
										tmp_additem=Add[x+tmp_item->xmove][y+tmp_item->ymove];
										while(tmp_additem->next!=0)								// Durchlauf bis zum Ende der Liste
											tmp_additem=tmp_additem->next;
									}
									tmp_additem->next=(additem*)malloc(sizeof(additem));
									tmp_additem->ID=tmp_item->ID;
									tmp_additem->color=tmp_item->color;
									
									if( isfirstitem == 1 )
									{
										tmp_additem->zlev=(MapAlt[x+tmp_item->xmove][y+tmp_item->ymove]+MapAlt[x+tmp_item->xmove+1][y+tmp_item->ymove]+MapAlt[x+tmp_item->xmove][y+tmp_item->ymove+1]+MapAlt[x+tmp_item->xmove+1][y+tmp_item->ymove+1])/4+tmp_item->zlev;
										isfirstitem = 0;
									}
									else
									{
										tmp_additem->zlev=(MapAlt[x+firstitem->xmove][y+firstitem->ymove]+MapAlt[x+firstitem->xmove+1][y+firstitem->ymove]+MapAlt[x+firstitem->xmove][y+firstitem->ymove+1]+MapAlt[x+firstitem->xmove+1][y+firstitem->ymove+1])/4+tmp_item->zlev + z;
									}

									tmp_item=tmp_item->next;
									tmp_additem=tmp_additem->next;
									tmp_additem->next=NULL;
								}
								break;
							}
							tmp_freq=tmp_freq->next;
						}
					}
					tmp_color=tmp_color->next;
				}
			}
		}
}













