Exemple #1
0
static void generate_moves_for_possibly_confronted_piece(slice_index si,
                                                         numvec dir_confronter)
{
  square const confronter_pos = curr_generation->departure+dir_confronter;

  TraceFunctionEntry(__func__);
  TraceFunctionParam("%u",si);
  TraceFunctionParamListEnd();

  if (TSTFLAG(being_solved.spec[confronter_pos],advers(trait[nbply])))
    pipe_move_generation_differnt_walk_delegate(si,get_walk_of_piece_on_square(confronter_pos));
  else
    pipe_move_generation_delegate(si);

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #2
0
/* Generate moves for a single piece
 * @param identifies generator slice
 */
void annan_generate_moves_for_piece(slice_index si)
{
  int const annaniser_dir = trait[nbply]==White ? -onerow : +onerow;
  square const annaniser_pos = curr_generation->departure+annaniser_dir;

  TraceFunctionEntry(__func__);
  TraceFunctionParam("%u",si);
  TraceFunctionParamListEnd();

  if (annanises(trait[nbply],annaniser_pos,curr_generation->departure))
    pipe_move_generation_differnt_walk_delegate(si,get_walk_of_piece_on_square(annaniser_pos));
  else
    pipe_move_generation_delegate(si);

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #3
0
/* Generate moves for a single piece
 * @param identifies generator slice
 */
void vaulting_kings_generate_moves_for_piece(slice_index si)
{
  Side const side = trait[nbply];
  Flags const mask = BIT(side)|BIT(Royal);

  if (TSTFULLFLAGMASK(being_solved.spec[curr_generation->departure],mask))
  {
    if (is_kingsquare_observed())
    {
      unsigned int i;
      for (i = 0; i!=nr_king_vaulters[side]; ++i)
        pipe_move_generation_differnt_walk_delegate(si,king_vaulters[side][i]);
    }
    else if (vaulting_kings_transmuting[side])
      return; /* don't generate non-vaulting moves */
  }

  pipe_solve_delegate(si);
}
/* Generate moves of a potentially transmuting king
 * @param si identifies move generator slice
 * @return true iff the king is transmuting (which doesn't necessarily mean that
 *              any moves were generated!)
 */
boolean generate_moves_of_transmuting_king(slice_index si)
{
  boolean result = false;
  piece_walk_type const *ptrans;
  numecoup const save_current_move = CURRMOVE_OF_PLY(nbply);

  TraceFunctionEntry(__func__);
  TraceFunctionParam("%u",si);
  TraceFunctionParamListEnd();

  for (ptrans = transmuting_kings_potential_transmutations; *ptrans!=Empty; ++ptrans)
    if (transmuting_kings_is_king_transmuting_as(*ptrans))
    {
      pipe_move_generation_differnt_walk_delegate(si,*ptrans);
      result = true;
    }

  remove_duplicate_moves_of_single_piece(save_current_move);

  TraceFunctionExit(__func__);
  TraceFunctionResult("%u",result);
  TraceFunctionResultEnd();
  return result;
}