static void by_promoted_pawn(slice_index si, unsigned int index_of_checker, square const check_from) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",index_of_checker); TraceSquare(check_from); TraceFunctionParamListEnd(); if (intelligent_can_promoted_white_pawn_theoretically_move_to(index_of_checker, check_from)) { 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: by_promoted_rider(si,index_of_checker,pp,check_from); break; case Knight: by_promoted_knight(si,index_of_checker,check_from); break; default: assert(0); break; } } TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Intercept with a promoted white 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_white_pawn(unsigned int intercepter_index, square where_to_intercept, boolean is_diagonal, void (*go_on)(void)) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",intercepter_index); TraceSquare(where_to_intercept); TraceFunctionParam("%u",is_diagonal); TraceFunctionParamListEnd(); if (intelligent_can_promoted_white_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_white_rider(Rook, intercepter_index, where_to_intercept, go_on); break; case Bishop: if (!is_diagonal) intelligent_place_promoted_white_rider(Bishop, intercepter_index, where_to_intercept, go_on); break; case Knight: intelligent_place_promoted_white_knight(intercepter_index, where_to_intercept, go_on); break; default: assert(0); break; } } TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
void intelligent_place_promoted_white_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_white_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_white_rider(pp, placed_index, placed_on, go_on); break; case Knight: intelligent_place_promoted_white_knight(placed_index, placed_on, go_on); break; default: assert(0); break; } } TraceFunctionExit(__func__); TraceFunctionResultEnd(); }