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(); }
/* 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(); }
/* 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; }