Location: PHPKode > projects > Some Chess > somechess.public/game_rules/threat.php
<?php
function aThreat($threatSq,$locations,$attackColor,$kingOkay=true){
	$defenseColor = ($attackColor == 'd')? 'l' : 'd';
	//--see if king is in check along COLUMN
	//ascending
	$num				= 8 - $threatSq{1};
	for($x=1;$x<=$num;++$x){
		$square			= $threatSq{0}.($threatSq{1} + $x);
		$piece			= $locations[$square];
		if($piece{1} == $defenseColor){
			break; // once we find a piece the defender owns we know that path is blocked
		}elseif($piece{1} == $attackColor){
			if($piece{0} == 'r' || $piece{0} == 'q'){
				$check[]	= $square;
				break; // stop searching, we've found what we are looking for
			}elseif($piece{0} == 'k' && $x == 1 && $kingOkay){
				$check[]	= $square;
				break; // stop searching, we've found what we are looking for
			}else{
				break; // if the piece is not a king queen or rook it can't attack the square AND it is blocking any other piece from attacking
			}
		}
	}
	//desceneding
	$num				= $threatSq{1} - 1;
	for($x=1;$x<=$num;++$x){
		$square			= $threatSq{0}.($threatSq{1} - $x);
		$piece			= $locations[$square];
		if($piece{1} == $defenseColor){
			break;
		}elseif($piece{1} == $attackColor){
			if($piece{0} == 'r' || $piece{0} == 'q'){
				$check[]	= $square;
				break;
			}elseif($piece{0} == 'k' && $x == 1 && $kingOkay){
				$check[]	= $square;
				break;
			}else{
				break;
			}
		}
	}
	//--see if king is in check along ROW
	//left to right
	$num				= 104 - ord($threatSq{0});
	for($x=1;$x<=$num;++$x){
		$square			= chr(ord($threatSq{0}) + $x).$threatSq{1};
		$piece			= $locations[$square];	
		if($piece{1} == $defenseColor){
			break;
		}elseif($piece{1} == $attackColor){
			if($piece{0} == 'r' || $piece{0} == 'q'){
				$check[]	= $square;
				break;
			}elseif($piece{0} == 'k' && $x == 1 && $kingOkay){
				$check[]	= $square;
				break;
			}else{
				break;
			}
		}
	}
	//right to left
	$num				= ord($threatSq{0}) - 97;
	for($x=1;$x<=$num;++$x){
		$square			= chr(ord($threatSq{0}) - $x).$threatSq{1};
		$piece			= $locations[$square];
		if($piece{1} == $defenseColor){
			break;
		}elseif($piece{1} == $attackColor){
			if($piece{0} == 'r' || $piece{0} == 'q'){
				$check[]	= $square;
				break;
			}elseif($piece{0} == 'k' && $x == 1 && $kingOkay){
				$check[]	= $square;
				break;
			}else{
				break;
			}
		}
	}
	//--see if king is in check along DIAGONALS
	//down and left
	$num				= 8-$threatSq{1};
	for($x=1;$x<=$num;++$x){
		$squareA				= ord($threatSq{0}) + $x;
		if($squareA <= 104){
			$square 			= chr($squareA).($threatSq{1} + $x);
			$piece				= $locations[$square];
			if($piece{1} == $defenseColor){
				break;
			}elseif($piece{1} == $attackColor){
				if($piece{0} == 'b' || $piece{0} == 'q'){
					$check[]	= $square;
					break;
				}elseif($piece{0} == 'p' && $x == 1 && $attackColor == 'd' && !empty($locations[$threatSq])){
					$check[]	= $square;
					break;
				}elseif($piece{0} == 'k' && $x == 1 && $kingOkay){
					$check[]	= $square;
					break;
				}else{
					break;
				}
			}
		}
	}
	//down and right
	$num				= 8-$threatSq{1};
	for($x=1;$x<=$num;++$x){
		$squareA				= ord($threatSq{0}) - $x;
		if($squareA >= 97){
			$square 			= chr($squareA).($threatSq{1} + $x);
			$piece				= $locations[$square];
			if($piece{1} == $defenseColor){
				break;
			}elseif($piece{1} == $attackColor){
				if($piece{0} == 'b' || $piece{0} == 'q'){
					$check[]	= $square;
					break;
				}elseif($piece{0} == 'p' && $x == 1 && $attackColor == 'd' && !empty($locations[$threatSq])){
					$check[]	= $square;
					break;
				}elseif($piece{0} == 'k' && $x == 1 && $kingOkay){
					$check[]	= $square;
					break;
				}else{
					break;
				}
			}
		}
	}		
	//up and right
	$num				= $threatSq{1}-1;
	for($x=1;$x<=$num;++$x){
		$squareA				= ord($threatSq{0}) + $x;
		if($squareA <= 104){
			$square 			= chr($squareA).($threatSq{1} - $x);
			$piece				= $locations[$square];
			if($piece{1} == $defenseColor){
				break;
			}elseif($piece{1} == $attackColor){
				if($piece{0} == 'b' || $piece{0} == 'q'){
					$check[]	= $square;
					break;
				}elseif($piece{0} == 'p' && $x == 1 && $attackColor == 'l' && !empty($locations[$threatSq])){
					$check[]	= $square;
					break;
				}elseif($piece{0} == 'k' && $x == 1 && $kingOkay){
					$check[]	= $square;
					break;
				}else{
					break;
				}
			}
		}
	}
	//up and left
	$num				= $threatSq{1}-1;
	for($x=1;$x<=$num;++$x){
		$squareA				= ord($threatSq{0}) - $x;
		if($squareA >= 97){
			$square 			= chr($squareA).($threatSq{1} - $x);
			$piece				= $locations[$square];
			if($piece{1} == $defenseColor){
				break;
			}elseif($piece{1} == $attackColor){
				if($piece{0} == 'b' || $piece{0} == 'q'){
					$check[]	= $square;
					break;
				}elseif($piece{0} == 'p' && $x == 1 && $attackColor == 'l' && !empty($locations[$threatSq])){
					$check[]	= $square;
					break;
				}elseif($piece{0} == 'k' && $x == 1 && $kingOkay){
					$check[]	= $square;
					break;
				}else{
					break;
				}
			}
		}
	}
	//--see if king is in check from KNIGHT
	//from far right
	$squareN[]	= chr(ord($threatSq{0}) - 2).($threatSq{1} + 1);
	$squareN[]	= chr(ord($threatSq{0}) - 2).($threatSq{1} - 1);
	//from far left
	$squareN[]	= chr(ord($threatSq{0}) + 2).($threatSq{1} + 1);
	$squareN[]	= chr(ord($threatSq{0}) + 2).($threatSq{1} - 1);
	//from near right
	$squareN[]	= chr(ord($threatSq{0}) - 1).($threatSq{1} + 2);
	$squareN[]	= chr(ord($threatSq{0}) - 1).($threatSq{1} - 2);
	//from near left
	$squareN[]	= chr(ord($threatSq{0}) + 1).($threatSq{1} + 2);
	$squareN[]	= chr(ord($threatSq{0}) + 1).($threatSq{1} - 2);
	//use the $squareN array to check for threatening knights
	for($x=0;$x<8;++$x){
		$square = $squareN[$x];
		$piece	= $locations[$square];
		if($piece{1} == $attackColor && $piece{0} == 'n'){
			$check[]	= $square;
		}
	}
	return $check;
}
?>
Return current item: Some Chess