static void init_disturb_mate_rider_onedir(square target, int dir, unsigned int index)
{
  square s;
  enum
  {
    nr_DisturbMateDirRider = sizeof DisturbMateDirRider / sizeof DisturbMateDirRider[0]
  };

  TraceFunctionEntry(__func__);
  TraceSquare(target);
  TraceFunctionParam("%d",dir);
  TraceFunctionParam("%u",index);
  TraceFunctionParamListEnd();

  assert(index<nr_DisturbMateDirRider);

  for (s = target+2*dir; is_square_empty(s); s += dir)
  {
    DisturbMateDirRider[index][s].dir = -dir;
    DisturbMateDirRider[index][s].target = target;
  }

  for (s = target-2*dir; is_square_empty(s); s -= dir)
  {
    DisturbMateDirRider[index][s].dir = dir;
    DisturbMateDirRider[index][s].target = target;
  }

  DisturbMateDirRider[index][target+dir].dir = disturbance_by_rider_uninterceptable;
  DisturbMateDirRider[index][target-dir].dir = disturbance_by_rider_uninterceptable;

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #2
0
static void maooa_rider_lion_generate_moves(numvec to_passed, numvec to_arrival)
{
  square const sq_departure = curr_generation->departure;
  square sq_passed = sq_departure+to_passed;
  curr_generation->arrival = sq_departure+to_arrival;

  while (is_square_empty(sq_passed) && is_square_empty(curr_generation->arrival))
  {
    sq_passed += to_arrival;
    curr_generation->arrival += to_arrival;
  }

  if (!is_square_blocked(sq_passed) && !is_square_blocked(curr_generation->arrival))
  {
    if (!is_square_empty(sq_passed)
        && (is_square_empty(curr_generation->arrival)
            || piece_belongs_to_opponent(curr_generation->arrival)))
      push_move();
    if (is_square_empty(sq_passed) || is_square_empty(curr_generation->arrival))
    {
      sq_passed += to_arrival;
      curr_generation->arrival += to_arrival;
      while (is_square_empty(sq_passed) && is_square_empty(curr_generation->arrival))
      {
        push_move();
        sq_passed += to_arrival;
        curr_generation->arrival += to_arrival;
      }
    }

    if (is_square_empty(sq_passed)
        && piece_belongs_to_opponent(curr_generation->arrival))
      push_move();
  }
}
Exemple #3
0
void intelligent_place_unpromoted_black_pawn(unsigned int placed_index,
                                             square placed_on,
                                             void (*go_on)(void))
{
  Flags const placed_flags = black[placed_index].flags;
  square const placed_comes_from = black[placed_index].diagram_square;

  TraceFunctionEntry(__func__);
  TraceFunctionParam("%u",placed_index);
  TraceSquare(placed_on);
  TraceFunctionParamListEnd();

  if (!TSTFLAGMASK(sq_spec[placed_on],BIT(BlBaseSq)|BIT(BlPromSq))
      && !black_pawn_attacks_king(placed_on)
      && intelligent_reserve_black_pawn_moves_from_to_no_promotion(placed_comes_from,
                                                                   placed_on))
  {
    occupy_square(placed_on,Pawn,placed_flags);

    switch (DisturbMateDirPawn[placed_on])
    {
      case disturbance_by_pawn_capture:
      case disturbance_by_pawn_interception_single:
        intelligent_pin_black_piece(placed_on,go_on);
        break;

      case disturbance_by_pawn_interception_double:
      {
        square const target = placed_on+2*dir_down;
        assert(is_square_empty(target));
        if (is_square_empty(placed_on+dir_down))
        {
          intelligent_intercept_black_move(placed_on,target,go_on);
          intelligent_pin_black_piece(placed_on,go_on);
        }
        else
          (*go_on)();
        break;
      }

      default:
        (*go_on)();
        break;
    }

    intelligent_unreserve();
  }

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #4
0
static void maooa_generate_move(numvec to_passed, numvec to_arrival)
{
  square const sq_departure = curr_generation->departure;
  square const sq_passed = sq_departure+to_passed;

  if (is_square_empty(sq_passed))
  {
    curr_generation->arrival = sq_departure+to_arrival;

    if (is_square_empty(curr_generation->arrival)
        || piece_belongs_to_opponent(curr_generation->arrival))
      hoppers_push_move(0,sq_passed);
  }
}
Exemple #5
0
static void maooahopper_generate_moves(vec_index_type k,
                                       numvec to_intermediate)
{
  numvec const to_arrival = vec[k];
  square const sq_departure = curr_generation->departure;
  square const sq_hurdle = sq_departure+to_intermediate;

  if (!is_square_empty(sq_hurdle))
  {
    curr_generation->arrival = sq_departure+to_arrival;
    if (is_square_empty(curr_generation->arrival)
        || piece_belongs_to_opponent(curr_generation->arrival))
      hoppers_push_move(k,sq_hurdle);
  }
}
Exemple #6
0
/* Is the placed white king in check from a particular direction?
 * @param dir direction
 * @return true iff the placed white king is in check from dir
 */
static boolean check_from_direction(int dir)
{
  square curr = being_solved.king_square[White]-dir;
  boolean const is_diagonal = SquareCol(curr)==SquareCol(being_solved.king_square[White]);
  boolean result;

  TraceFunctionEntry(__func__);
  TraceFunctionParam("%d",dir);
  TraceFunctionParamListEnd();

  while (is_square_empty(curr))
    curr -= dir;

  if (TSTFLAG(being_solved.spec[curr],Black))
  {
    piece_walk_type const checker = get_walk_of_piece_on_square(curr);
    result = checker==Queen || checker==(is_diagonal ? Bishop : Rook);
  }
  else
    result = false;

  TraceFunctionExit(__func__);
  TraceFunctionResult("%u",result);
  TraceFunctionResultEnd();
  return result;
}
Exemple #7
0
static boolean rrefnech(square i1, validator_id evaluate)
{
  square const sq_target = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;
  vec_index_type k;

  if (!NoEdge(i1))
    settraversed(i1);

  for (k= vec_knight_start; k<=vec_knight_end; k++) {
    square sq_departure = i1+vec[k];

    while (is_square_empty(sq_departure))
    {
      if (!NoEdge(sq_departure) &&
          !traversed(sq_departure)) {
        if (rrefnech(sq_departure,evaluate))
          return true;
        break;
      }
      sq_departure += vec[k];
    }

    if (EVALUATE_OBSERVATION(evaluate,sq_departure,sq_target))
      return true;
  }
  return false;
}
Exemple #8
0
static boolean rrefcech(square i1, int x, validator_id evaluate)
{
  square const sq_target = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;
  vec_index_type k;

  /* ATTENTION:   first call of rrefech: x must be 2 !!   */

  square sq_departure;

  for (k= vec_knight_start; k <= vec_knight_end; k++)
    if (x) {
      sq_departure= i1+vec[k];
      if (is_square_empty(sq_departure)) {
        if (!NoEdge(sq_departure)) {
          if (rrefcech(sq_departure,x-1,evaluate))
            return true;
        }
      }
      else if (EVALUATE_OBSERVATION(evaluate,sq_departure,sq_target))
        return true;
    }
    else
      for (k= vec_knight_start; k <= vec_knight_end; k++) {
        sq_departure= i1+vec[k];
        if (EVALUATE_OBSERVATION(evaluate,sq_departure,sq_target))
          return true;
      }

  return false;
}
Exemple #9
0
static void bouncy_nightrider_generate_moves_recursive(square step_departure)
{
  vec_index_type k;

  if (!NoEdge(step_departure))
    settraversed(step_departure);

  for (k= vec_knight_start; k<=vec_knight_end; k++)
  {
    curr_generation->arrival = step_departure+vec[k];

    while (is_square_empty(curr_generation->arrival))
    {
      push_move();
      if (!NoEdge(curr_generation->arrival) && !traversed(curr_generation->arrival))
      {
        bouncy_nightrider_generate_moves_recursive(curr_generation->arrival);
        break;
      }
      else
        curr_generation->arrival += vec[k];
    }

    if (piece_belongs_to_opponent(curr_generation->arrival))
      push_move();
  }
}
Exemple #10
0
static boolean is_mate_square(Side other_side)
{
  boolean result = false;

  if (is_square_empty(being_solved.king_square[other_side]))
  {
    TraceFunctionEntry(__func__);
    TraceEnumerator(Side,other_side,"");
    TraceFunctionParamListEnd();

    TraceSquare(being_solved.king_square[other_side]);TraceEOL();

    occupy_square(being_solved.king_square[other_side],King,BIT(Royal)|BIT(other_side));

    if (conditional_pipe_solve_delegate(temporary_hack_mate_tester[other_side])
        ==previous_move_has_solved)
      result = true;

    empty_square(being_solved.king_square[other_side]);

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

  return result;
}
Exemple #11
0
boolean cat_check(validator_id evaluate)
{
  square const sq_target = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;
  if (leapers_check(vec_knight_start,vec_knight_end,evaluate))
    return true;
  else
  {
    vec_index_type  k;
    for (k = vec_dabbaba_start; k<=vec_dabbaba_end; k++)
    {
      square middle_square= sq_target+vec[k];
      while (is_square_empty(middle_square))
      {
        {
          square const sq_departure= middle_square+cat_vectors[k-60];
          if (EVALUATE_OBSERVATION(evaluate,sq_departure,sq_target))
            return true;
        }

        {
          square const sq_departure= middle_square+cat_vectors[k-56];
          if (EVALUATE_OBSERVATION(evaluate,sq_departure,sq_target))
            return true;
        }

        middle_square += vec[k];
      }
    }

    return false;
  }
}
Exemple #12
0
static boolean are_all_imitator_arrivals_empty(square sq_departure, square sq_arrival)
{
  unsigned int imi_idx;
  int const diff = sq_arrival-sq_departure;
  boolean result = true;

  TraceFunctionEntry(__func__);
  TraceSquare(sq_departure);
  TraceSquare(sq_arrival);
  TraceFunctionParamListEnd();

  for (imi_idx = being_solved.number_of_imitators; imi_idx>0; imi_idx--)
  {
    square const j2 = being_solved.isquare[imi_idx-1]+diff;
    if (j2!=sq_departure && !is_square_empty(j2))
    {
      result = false;
      break;
    }
  }

  TraceFunctionExit(__func__);
  TraceFunctionResult("%u",result);
  TraceFunctionResultEnd();
  return result;
}
Exemple #13
0
static boolean is_imitator_line_clear(unsigned int i,
                                      numvec diff_first_necessarily_empty,
                                      numvec step,
                                      numvec diff_first_not_necessarily_empty)
{
  boolean result = true;
  square const sq_first_not_necessarily_empty = being_solved.isquare[i]+diff_first_not_necessarily_empty;
  square sq_curr;

  TraceFunctionEntry(__func__);
  TraceValue("%u",i);
  TraceValue("%d",diff_first_necessarily_empty);
  TraceValue("%d",step);
  TraceValue("%d",diff_first_not_necessarily_empty);
  TraceFunctionParamListEnd();

  for (sq_curr = being_solved.isquare[i]+diff_first_necessarily_empty; sq_curr!=sq_first_not_necessarily_empty; sq_curr += step)
  {
    TraceSquare(sq_curr);TraceEOL();
    if (!is_square_empty(sq_curr))
    {
      result = false;
      break;
    }
  }

  TraceFunctionExit(__func__);
  TraceFunctionResult("%u",result);
  TraceFunctionResultEnd();
  return result;
}
Exemple #14
0
static void HandleAddedPiece(square s, void *param)
{
    piece_addition_settings * const settings = param;

    if (!is_square_empty(s))
    {
        if (settings->type==piece_addition_initial)
        {
            WriteSquare(&output_plaintext_engine,stdout,s);
            output_plaintext_message(OverwritePiece);

            underworld_make_space(nr_ghosts);
            underworld[nr_ghosts-1].walk = get_walk_of_piece_on_square(s);
            underworld[nr_ghosts-1].flags = being_solved.spec[s];
            underworld[nr_ghosts-1].on = s;
        }
        else
        {
            move_effect_journal_do_circe_volcanic_remember(move_effect_reason_diagram_setup,
                    s);
            move_effect_journal_do_piece_removal(move_effect_reason_diagram_setup,
                                                 s);
        }
    }

    if (settings->type==piece_addition_twinning)
        move_effect_journal_do_piece_creation(move_effect_reason_diagram_setup,
                                              s,settings->walk,
                                              settings->spec,
                                              no_side);
    else
        occupy_square(s,settings->walk,settings->spec);
}
/* Try to solve in solve_nr_remaining half-moves.
 * @param si slice index
 * @note assigns solve_result the length of solution found and written, i.e.:
 *            previous_move_is_illegal the move just played is illegal
 *            this_move_is_illegal     the move being played is illegal
 *            immobility_on_next_move  the moves just played led to an
 *                                     unintended immobility on the next move
 *            <=n+1 length of shortest solution found (n+1 only if in next
 *                                     branch)
 *            n+2 no solution found in this branch
 *            n+3 no solution found in next branch
 *            (with n denominating solve_nr_remaining)
 */
void orthodox_mating_king_contact_generator_solve(slice_index si)
{
  Side const moving = SLICE_STARTER(si);
  Side const mated = advers(moving);
  square const sq_mated_king = being_solved.king_square[mated];

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

  assert(solve_nr_remaining==slack_length+1);

  curr_generation->departure = being_solved.king_square[moving];

  if (curr_generation->departure!=sq_mated_king)
  {
    vec_index_type k;
    for (k = vec_queen_start; k<=vec_queen_end; k++)
    {
      curr_generation->arrival = curr_generation->departure+vec[k];
      if ((is_square_empty(curr_generation->arrival)
          || TSTFLAG(being_solved.spec[curr_generation->arrival],mated))
          && move_diff_code[abs(sq_mated_king-curr_generation->arrival)]<=1+1)
        push_move();
    }
  }

  pipe_solve_delegate(si);

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #16
0
static boolean find_illegal_observation(void)
{
  Side const save_trait = trait[nbply];
  boolean result = false;
  square square_h = square_h8;
  int i;

  TraceFunctionEntry(__func__);
  TraceFunctionParamListEnd();

  for (i = nr_rows_on_board; i>0; i--, square_h += dir_down)
  {
    int j;
    square z = square_h;
    for (j = nr_files_on_board; j>0; j--, z += dir_left)
      if (!is_square_empty(z)
          && (is_piece_illegally_observed(White,z)
              || is_piece_illegally_observed(Black,z)))
      {
        result = true;
        break;
      }
  }

  /* We have juggled with trait[npbly] to be able to reuse Madrasi
   * functionality. Now we have to clean up after ourselves: */
  trait[nbply] = save_trait;

  TraceFunctionExit(__func__);
  TraceFunctionResult("%u",result);
  TraceFunctionResultEnd();
  return result;
}
Exemple #17
0
static void reflecting_bishop_generate_moves_recursive(square in, numvec dir, unsigned int nr_remaining_reflections)
{
  curr_generation->arrival = in+dir;

  if (is_square_blocked(curr_generation->arrival))
    return;

  while (is_square_empty(curr_generation->arrival))
  {
    push_move();
    curr_generation->arrival += dir;
  }

  if (piece_belongs_to_opponent(curr_generation->arrival))
    push_move();
  else if (nr_remaining_reflections>0 && is_square_blocked(curr_generation->arrival))
  {
    square const sq_reflection = curr_generation->arrival-dir;

    vec_index_type const dir_index = find_vec_index(dir);
    vec_index_type const dir_reflected_index = dir_index*2;

    reflecting_bishop_generate_moves_recursive(sq_reflection,
                                               angle_vectors[angle_90][dir_reflected_index],
                                               nr_remaining_reflections-1);
    reflecting_bishop_generate_moves_recursive(sq_reflection,
                                               angle_vectors[angle_90][dir_reflected_index-1],
                                               nr_remaining_reflections-1);
  }
}
Exemple #18
0
/* Try to solve in solve_nr_remaining half-moves.
 * @param si slice index
 * @note assigns solve_result the length of solution found and written, i.e.:
 *            previous_move_is_illegal the move just played is illegal
 *            this_move_is_illegal     the move being played is illegal
 *            immobility_on_next_move  the moves just played led to an
 *                                     unintended immobility on the next move
 *            <=n+1 length of shortest solution found (n+1 only if in next
 *                                     branch)
 *            n+2 no solution found in this branch
 *            n+3 no solution found in next branch
 *            (with n denominating solve_nr_remaining)
 */
void haunted_chess_ghost_summoner_solve(slice_index si)
{
  underworld_index_type idx_ghost = nr_ghosts;

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

  while (idx_ghost>0)
  {
    --idx_ghost;
    if (is_square_empty(underworld[idx_ghost].on))
    {
      move_effect_journal_do_piece_readdition(move_effect_reason_summon_ghost,
                                              underworld[idx_ghost].on,
                                              underworld[idx_ghost].walk,
                                              underworld[idx_ghost].flags,
                                              no_side);

      move_effect_journal_do_forget_ghost(idx_ghost);
    }
  }

  pipe_solve_delegate(si);

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #19
0
/* Determine whether a specific piece delivers check to a specific side
 * @param observer_origin potentially delivering check ...
 * @note the piece on pos_checking must belong to advers(side)
 * @note sets observation_result
 */
void marscirce_is_square_observed(slice_index si)
{
  circe_rebirth_context_elmt_type * const context = &circe_rebirth_context_stack[circe_rebirth_context_stack_pointer-1];
  square const sq_target = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;

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

  assert(circe_rebirth_context_stack_pointer>0);

  observation_result = false;

  if (observing_walk[nbply]<Queen || observing_walk[nbply]>Bishop
      || CheckDir[observing_walk[nbply]][sq_target-context->rebirth_square]!=0)
  {
    if (is_square_empty(context->rebirth_square))
    {
      TraceSquare(context->rebirth_square);
      TraceWalk(context->reborn_walk);
      TraceValue("%u",TSTFLAG(being_solved.spec[context->rebirth_square],White));
      TraceValue("%u",TSTFLAG(being_solved.spec[context->rebirth_square],Black));
      TraceEOL();
      occupy_square(context->rebirth_square,context->reborn_walk,context->reborn_spec);
      pipe_is_square_observed_delegate(si);
      empty_square(context->rebirth_square);
    }
  }

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #20
0
static boolean maooacheck(vec_index_type vec_index_pass_target_begin,
                          vec_index_type vec_index_pass_target_end,
                          validator_id evaluate)
{
  square const sq_target = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;
  boolean result = false;

  ++observation_context;

  for (interceptable_observation[observation_context].vector_index1 = vec_index_pass_target_end;
       interceptable_observation[observation_context].vector_index1>=vec_index_pass_target_begin;
       --interceptable_observation[observation_context].vector_index1)
  {
    numvec const vec_pass_target = vec[interceptable_observation[observation_context].vector_index1];
    square const sq_pass = sq_target+vec_pass_target;

    if (is_square_empty(sq_pass)
        && (maooacheck_onedir(sq_pass,2*interceptable_observation[observation_context].vector_index1,evaluate)
            || maooacheck_onedir(sq_pass,2*interceptable_observation[observation_context].vector_index1-1,evaluate)))
    {
      result = true;
      break;
    }
  }

  --observation_context;

  return result;
}
Exemple #21
0
static boolean maooarider_check(numvec to_passed,
                                numvec to_departure,
                                validator_id evaluate)
{
  square const sq_target = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;
  square sq_passed = sq_target+to_passed;
  square sq_departure= sq_target+to_departure;

  while (is_square_empty(sq_passed) && is_square_empty(sq_departure))
  {
    sq_passed += to_departure;
    sq_departure += to_departure;
  }

  return (is_square_empty(sq_passed)
          && EVALUATE_OBSERVATION(evaluate,sq_departure,sq_target));
}
Exemple #22
0
/* Try to solve in solve_nr_remaining half-moves.
 * @param si slice index
 * @note assigns solve_result the length of solution found and written, i.e.:
 *            previous_move_is_illegal the move just played is illegal
 *            this_move_is_illegal     the move being played is illegal
 *            immobility_on_next_move  the moves just played led to an
 *                                     unintended immobility on the next move
 *            <=n+1 length of shortest solution found (n+1 only if in next
 *                                     branch)
 *            n+2 no solution found in this branch
 *            n+3 no solution found in next branch
 *            (with n denominating solve_nr_remaining)
 */
void haan_chess_hole_inserter_solve(slice_index si)
{
  move_effect_journal_index_type const top = move_effect_journal_base[nbply+1];
  move_effect_journal_index_type curr;
  boolean piece_visited[MaxPieceId+1] = { false };

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

  for (curr = move_effect_journal_base[nbply]; curr!=top; ++curr)
    if (move_effect_journal[curr].type==move_effect_piece_movement)
    {
      PieceIdType const id = GetPieceId(move_effect_journal[curr].u.piece_movement.movingspec);
      if (!piece_visited[id])
      {
        square const from = move_effect_journal[curr].u.piece_movement.from;
        if (is_square_empty(from))
          move_effect_journal_do_square_block(move_effect_journal[curr].reason,from);
        piece_visited[id] = true;
      }
    }
    else if (move_effect_journal[curr].type==move_effect_piece_removal
             && move_effect_journal[curr].reason==move_effect_reason_ep_capture)
    {
      PieceIdType const id = GetPieceId(move_effect_journal[curr].u.piece_removal.flags);
      if (!piece_visited[id])
      {
        square const on = move_effect_journal[curr].u.piece_removal.on;
        assert(is_square_empty(on));
        move_effect_journal_do_square_block(move_effect_journal[curr].reason,on);
        piece_visited[id] = true;
      }
    }

  pipe_solve_delegate(si);

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
void intelligent_mate_generate_checking_moves(slice_index si)
{
  unsigned int index;

  TraceFunctionEntry(__func__);
  TraceFunctionParamListEnd();

  if (intelligent_reserve_masses(White,1,piece_gives_check))
  {
    for (index = 1; index<MaxPiece[White]; ++index)
    {
      square const *bnp;

      white[index].usage = piece_gives_check;

      for (bnp = boardnum; *bnp!=initsquare; ++bnp)
        if (is_square_empty(*bnp))
        {
          switch (white[index].type)
          {
            case Queen:
            case Rook:
            case Bishop:
              by_rider(si,index,*bnp);
              break;

            case Knight:
              by_knight(si,index,*bnp);
              break;

            case Pawn:
              by_unpromoted_pawn(si,index,*bnp);
              by_promoted_pawn(si,index,*bnp);
              break;

            default:
              assert(0);
              break;
          }

          empty_square(*bnp);
        }

      white[index].usage = piece_is_unused;
    }

    intelligent_unreserve();
  }

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #24
0
static boolean have_all_imitators_hurdle(numvec diff_hurdle)
{
  unsigned int i;

  for (i = 0; i!=being_solved.number_of_imitators; ++i)
  {
    square const sq_hurdle = being_solved.isquare[i]+diff_hurdle;
    if (is_square_empty(sq_hurdle) || is_square_blocked(sq_hurdle))
      return false;
  }

  return true;
}
/* Try to solve in solve_nr_remaining half-moves.
 * @param si slice index
 * @note assigns solve_result the length of solution found and written, i.e.:
 *            previous_move_is_illegal the move just played is illegal
 *            this_move_is_illegal     the move being played is illegal
 *            immobility_on_next_move  the moves just played led to an
 *                                     unintended immobility on the next move
 *            <=n+1 length of shortest solution found (n+1 only if in next
 *                                     branch)
 *            n+2 no solution found in this branch
 *            n+3 no solution found in next branch
 *            (with n denominating solve_nr_remaining)
 */
void circe_test_rebirth_square_empty_solve(slice_index si)
{
  circe_rebirth_context_elmt_type const * const context = &circe_rebirth_context_stack[circe_rebirth_context_stack_pointer];

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

  assert(context->reborn_walk!=Empty);

  binary_solve_if_then_else(si,!is_square_empty(context->rebirth_square));

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #26
0
static void HandleAddedPiece(square s, void *param)
{
  piece_addition_settings * const settings = param;

  if (!is_square_empty(s))
  {
    move_effect_journal_do_circe_volcanic_remember(move_effect_reason_diagram_setup,s);
    move_effect_journal_do_piece_removal(move_effect_reason_diagram_setup,s);
  }

  move_effect_journal_do_piece_creation(move_effect_reason_diagram_setup,
                                        s,settings->walk,
                                        settings->spec,
                                        no_side);
}
Exemple #27
0
static boolean marine_leaper_check(vec_index_type kanf, vec_index_type kend,
                                   validator_id evaluate)
{
    square const sq_target = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;
    vec_index_type k;
    for (k = kanf; k<=kend; ++k)
    {
        square const sq_arrival = sq_target-vec[k];
        square const sq_departure = sq_target+vec[k];
        if (is_square_empty(sq_arrival)
                && EVALUATE_OBSERVATION(evaluate,sq_departure,sq_arrival))
            return true;
    }

    return false;
}
/* Intercept a check to the white king with a white piece
 * @param dir_from_rider direction from rider giving check to white king
 * @param go_on what to do after each successful interception?
 */
static void white_piece(slice_index si, int dir_from_rider, void (*go_on)(slice_index si))
{
  square where_to_intercept;

  TraceFunctionEntry(__func__);
  TraceFunctionParam("%d",dir_from_rider);
  TraceFunctionParamListEnd();

  for (where_to_intercept = being_solved.king_square[White]-dir_from_rider;
       is_square_empty(where_to_intercept);
       where_to_intercept -= dir_from_rider)
    if (nr_reasons_for_staying_empty[where_to_intercept]==0)
      white_piece_on(si,where_to_intercept,go_on);

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #29
0
static boolean find_flights(slice_index si,
                            Side side_in_check,
                            unsigned int nr_flights_to_find)
{
  unsigned int nr_flights_found = 0;
  square const save_king_square = being_solved.king_square[side_in_check];
  piece_walk_type const king_walk = get_walk_of_piece_on_square(save_king_square);
  Flags const king_flags = being_solved.spec[save_king_square];
  square const save_departure = curr_generation->departure ;

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

  siblingply(side_in_check);

  curr_generation->departure = save_king_square;
  move_generation_current_walk = king_walk;
  generate_moves_for_piece_based_on_walk();

  empty_square(save_king_square);

  while (encore())
  {
    being_solved.king_square[side_in_check] = move_generation_stack[CURRMOVE_OF_PLY(nbply)].arrival;
    if ((is_square_empty(being_solved.king_square[side_in_check])
         || TSTFLAG(being_solved.spec[being_solved.king_square[side_in_check]],advers(side_in_check)))
        && being_solved.king_square[side_in_check]!=being_solved.king_square[advers(side_in_check)]
        && !pipe_is_in_check_recursive_delegate(si,side_in_check))
      ++nr_flights_found;

    pop_move();
  }

  being_solved.king_square[side_in_check] = save_king_square;
  occupy_square(save_king_square,king_walk,king_flags);

  curr_generation->departure = save_departure;

  finply();

  TraceFunctionExit(__func__);
  TraceFunctionResult("%u",nr_flights_found>nr_flights_to_find);
  TraceFunctionResultEnd();
  return nr_flights_found>nr_flights_to_find;
}
Exemple #30
0
/* Generate moves for a chinese leaper piece
 * @param kbeg start of range of vector indices to be used
 * @param kend end of range of vector indices to be used
 */
void chinese_leaper_generate_moves(vec_index_type kbeg, vec_index_type kend)
{
  vec_index_type k;

  for (k = kbeg; k<=kend; ++k)
  {
    curr_generation->arrival = curr_generation->departure + vec[k];

    if (is_square_empty(curr_generation->arrival))
      push_move();
    else if (!is_square_blocked(curr_generation->arrival))
    {
      curr_generation->arrival += vec[k];
      if (piece_belongs_to_opponent(curr_generation->arrival))
        push_move();
    }
  }
}