var connect_offs = [1, 2, 2*xsize+3, 0]; // relative positions of connect[] 
var construction_count=1;
var connect	= [-1, -1, -1]; // -1=> unassigned; 0=> closed construction >0 => id of ongoing construction
var connect_debug=0;

function put_connect(x,y,edge,value)
{
	if (connect_debug) alert("put_connect("+x+","+y+","+edge+","+value+")");
	var b=2*(y*(xsize+1)+x);
	b+=connect_offs[edge];
	connect[b]=value; 
	if (connect_debug) alert("put_connect() at conn-idx " + b + " done");
}

function get_connect(x,y,edge)
{
	if (connect_debug) alert("get_connect("+x+","+y+","+edge+")");
	var b=2*(y*(xsize+1)+x);
	b+=connect_offs[edge];
	if (connect_debug) alert("get_connect() at conn-idx " + b + "returns "+connect[b]);
	return(connect[b]);
}

// check whether the new piece at (x,y) merges existing constructions or opens new ones.
// Also check whether constructions are completed. If so, update the total_score. 
// Returns a text that reports completion of any constructions.

function update_connectivity(x,y)
{
	if (connect_debug) alert("update_connectivity("+x+","+y+")");
	var fx = get_field(x,y); // get field and rotation of current field
	var rx = get_rotation(x,y);
	var txt = update_connectivity_extended(x,y,fx,rx,'b',mask_cc) 		// check castles
		+ update_connectivity_extended(x,y,fx,rx,'s',mask_sc); 		// check streets
	for (var i=x-1; i<=x+1; i++)
		for (var j=y-1; j<=y+1; j++)
			txt += check_abbey(i,j);
	if (connect_debug) alert("update_connectivity done");
	return(txt);
}

function update_connectivity_extended(x,y,fx,rx,type,mask)
{
	var txt="";
	if (pool[fx*px+5] & mask) {
		if (connect_debug) alert("connected " + (type=='b' ? "castle" : "street"));
		var cnr1=-1;
		for (var i=0; i<4; i++) {
			if (get_edge(fx, rx, i) != type)
				continue;
			var cnr=get_connect(x,y,i);
			if (cnr<0) {
				cnr = construction_count++;
				put_connect(x,y,i,cnr);
			}
			if (cnr1<0)
				cnr1=cnr; // 1st edge
			else {
				var cnt=0;
				for (var j=0; j<connect.length; j++)
					if (connect[j]==cnr) {
						connect[j]=cnr1;
						cnt++;
					}
				if (connect_debug) alert("update_connectivity(): "+cnt+" edges joined "+cnr+" --> "+cnr1);
			}
		}
		txt += check_for_completion(cnr1,type);
	} else {
		if (connect_debug) alert("not a connected " + (type=='b' ? "castle" : "street"));
		for (var i=0; i<4; i++) {
			if (get_edge(fx, rx, i) != type)
				continue;
			var cnr=get_connect(x,y,i);
			if (cnr>0)
				txt+=check_for_completion(cnr,type)
			else if (cnr<0) {
				cnr = construction_count++;
				put_connect(x,y,i,cnr);
			}
		}
	}
	return(txt);
}


function check_for_completion(cnr,type) // non-optimized version. Returns status text for new buildings. total_score is updated on the fly
{
	var v=0;
	if (connect_debug) alert("checking " + (type=='b' ? "castle " : "street ") +cnr+" for completion");
	for (y=0; y<ysize; y++)
		for (x=0; x<xsize; x++) {
			var touched=false;
			if(get_field(x,y)<0)
				continue;
			if (get_connect(x,y,0)==cnr) {
				if (get_field(x,y-1)>=0)
					touched=true;
				else {
					if (connect_debug) alert("check_for_completion field "+x+"/"+y+" top edge unfinished");
					return("");
				}
			}			
			if (get_connect(x,y,1)==cnr) {
				if (get_field(x+1,y)>=0)
					touched=true;
				else {
					if (connect_debug) alert("check_for_completion field "+x+"/"+y+" right edge unfinished");
					return("");
				}
			}			
			if (get_connect(x,y,2)==cnr) {
				if (get_field(x,y+1)>=0)
					touched=true;
				else {
					if (connect_debug) alert("check_for_completion field "+x+"/"+y+" bottom edge unfinished");
					return("");
				}
			}			
			if (get_connect(x,y,3)==cnr) {
				if (get_field(x-1,y)>=0)
					touched=true;
				else {
					if (connect_debug) alert("check_for_completion field "+x+"/"+y+" left edge unfinished");
					return("");
				}
			}
			if (touched) {
				if (connect_debug) alert("check_for_completion: field "+x+"/"+y+" covered by building");
				if (type=='b') {
					if (is_bonus(x,y))
						v+=4;
					else
						v+=2;
				} else
					v++;
			}
		}
	if (type=='b' && v==4)
		v=2;
	if (connect_debug) alert("connectivity check: " + (type=='b' ? "castle" : "street") + " completed; " + v + " points");
	total_score += v;
	return("Neue " + (type=='b' ? "Burg" : "Strasse") + "(" + v + "). ");
}


function check_abbey(x,y)
{
	var f=get_field(x,y);
	if (f<0 || pool[f*px] != "wwww")
		return("");
	for (var i=x-1; i<=x+1; i++)	
		for (var j=y-1; j<=y+1; j++)	
			if (get_field(i,j)<0)
				return("");
	total_score += 9;
	return("Neues Kloster(9). ");	
}




