/* Intercept a check to the white king with a promoted black pawn * @param intercepter_index identifies intercepting pawn * @param where_to_intercept what square * @param is_diagonal true iff we are intercepting a check on a diagonal line * @param go_on what to do after each successful interception? */ static void promoted_black_pawn(slice_index si, unsigned int intercepter_index, square where_to_intercept, boolean is_diagonal, void (*go_on)(slice_index si)) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",intercepter_index); TraceSquare(where_to_intercept); TraceFunctionParam("%u",is_diagonal); TraceFunctionParamListEnd(); if (intelligent_can_promoted_black_pawn_theoretically_move_to(intercepter_index, where_to_intercept)) { piece_walk_type pp; for (pp = pieces_pawns_promotee_sequence[pieces_pawns_promotee_chain_orthodox][Empty]; pp!=Empty; pp = pieces_pawns_promotee_sequence[pieces_pawns_promotee_chain_orthodox][pp]) switch (pp) { case Queen: break; case Rook: if (is_diagonal) intelligent_place_promoted_black_rider(si, intercepter_index, Rook, where_to_intercept, go_on); break; case Bishop: if (!is_diagonal) intelligent_place_promoted_black_rider(si, intercepter_index, Bishop, where_to_intercept, go_on); break; case Knight: intelligent_place_promoted_black_knight(si, intercepter_index, where_to_intercept, go_on); break; default: assert(0); break; } } TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
void intelligent_place_promoted_black_pawn(unsigned int placed_index, square placed_on, void (*go_on)(void)) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",placed_index); TraceSquare(placed_on); TraceFunctionParamListEnd(); if (intelligent_can_promoted_black_pawn_theoretically_move_to(placed_index, placed_on)) { piece_walk_type pp; for (pp = pieces_pawns_promotee_sequence[pieces_pawns_promotee_chain_orthodox][Empty]; pp!=Empty; pp = pieces_pawns_promotee_sequence[pieces_pawns_promotee_chain_orthodox][pp]) switch (pp) { case Queen: case Rook: case Bishop: intelligent_place_promoted_black_rider(placed_index, pp, placed_on, go_on); break; case Knight: intelligent_place_promoted_black_knight(placed_index,placed_on,go_on); break; default: assert(0); break; } } TraceFunctionExit(__func__); TraceFunctionResultEnd(); }