Exemple #1
0
static boolean maooariderlion_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;
  }

  if (!is_square_empty(sq_passed)
      && EVALUATE_OBSERVATION(evaluate,sq_departure,sq_target))
    return true;

  if (!is_square_blocked(sq_passed) && !is_square_blocked(sq_departure)
      && (is_square_empty(sq_passed) || is_square_empty(sq_departure)))
  {
    sq_passed += to_departure;
    sq_departure += to_departure;

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

    if (is_square_empty(sq_passed)
        && EVALUATE_OBSERVATION(evaluate,sq_departure,sq_target))
      return true;
  }

  return false;
}
Exemple #2
0
static boolean enforce_possibly_confronted_observer_walk(slice_index si,
                                                         numvec dir_confronter)
{
  square const sq_departure = move_generation_stack[CURRMOVE_OF_PLY(nbply)].departure;
  Side const side_attacking = trait[nbply];
  square const pos_confronter = sq_departure+dir_confronter;
  piece_walk_type walk;
  boolean result;

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

  TraceSquare(sq_departure);
  TraceSquare(pos_confronter);
  TraceEOL();

  if (TSTFLAG(being_solved.spec[pos_confronter],advers(side_attacking)))
    walk = get_walk_of_piece_on_square(pos_confronter);
  else
    walk = get_walk_of_piece_on_square(sq_departure);

  TraceWalk(walk);
  TraceWalk(observing_walk[nbply]);
  TraceEOL();

  if (walk==observing_walk[nbply])
    result = pipe_validate_observation_recursive_delegate(si);
  else
    result = false;

  TraceFunctionExit(__func__);
  TraceFunctionResult("%u",result);
  TraceFunctionResultEnd();
  return result;
}
/* 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;
}
Exemple #4
0
static void identify_line(void)
{
  square const sq_observer = move_generation_stack[CURRMOVE_OF_PLY(nbply)].departure;

  TraceFunctionEntry(__func__);
  TraceFunctionParamListEnd();

  TraceSquare(sq_observer);
  TraceWalk(being_solved.board[sq_observer]);
  TraceEOL();
  switch (being_solved.board[sq_observer])
  {
    /* TODO simplify using classes? */
    case Rook:
    case Queen:
    case Bishop:
    case NightRider:
    case Waran:
    case Camelrider:
    case Zebrarider:
    case Gnurider:
    case SuperBerolinaPawn:
    case SuperPawn:
    case RookHunter:
    case BishopHunter:
    case WesirRider:
    case FersRider:
    case Elephant:
    case Lion:
    case RookLion:
    case BishopLion:
    case NightRiderLion:
    case Pao:
    case Leo:
    case Vao:
    case Nao:
    case Locust:
    case NightLocust:
    case BishopLocust:
    case RookLocust:
    case Sirene:
    case Triton:
    case Nereide:
    case Kangaroo:
    case KangarooLion:
    case Rabbit:
    case Kao:
    case Elk:
    case RookMoose:
    case BishopMoose:
    case Eagle:
    case RookEagle:
    case BishopEagle:
    case Sparrow:
    case RookSparrow:
    case BishopSparrow:
    case Marguerite:
    case EquiHopper:
    case Orix:
    case EdgeHog:
    case Grasshopper:
    case NightriderHopper:
    case CamelRiderHopper:
    case ZebraRiderHopper:
    case GnuRiderHopper:
    case RookHopper:
    case BishopHopper:
    case ContraGras:
    case GrassHopper2:
    case GrassHopper3:
    case Bob:
    case EquiStopper:
    case MaoRider:
    case MoaRider:
    case MaoRiderLion:
    case MoaRiderLion:
    case Dolphin:
    case Bouncer :
    case RookBouncer:
    case BishopBouncer:
      identify_straight_line();
      break;

    case Rose:
    case RoseLion:
    case RoseHopper:
    case RoseLocust:
    case Rao:
      identify_circular_line();
      break;

    case SpiralSpringer:
    case DiagonalSpiralSpringer:
    case SpiralSpringer40:
    case SpiralSpringer20:
    case SpiralSpringer33:
    case SpiralSpringer11:
    case BoyScout:
    case GirlScout:
      identify_zigzag_line();
      break;

    case DoubleGras:
    case DoubleRookHopper:
    case DoubleBishopper:
      identify_doublehopper_line();
      break;

    case Amazone:
    case Empress:
    case Princess:
    case Gryphon:
    case Ship:
    case Gral:
    case Scorpion:
    case Querquisite:
    case MarineShip:
      identify_combined_rider_leaper_line();
      break;

    case King:
    case Poseidon:
    case ErlKing:
    case Knight:
    case Zebra:
    case Camel:
    case Giraffe:
    case RootFiftyLeaper:
    case Bucephale:
    case Wesir:
    case Alfil:
    case Fers:
    case Dabbaba:
    case Gnu:
    case Antilope:
    case Squirrel:
    case Okapi:
    case Leap37:
    case Leap16:
    case Leap24:
    case Leap35:
    case Leap15:
    case Leap25:
    case Bison:
    case Zebu:
    case Leap36:
    case Mao:
    case Moa:
    case NonStopEquihopper:
    case NonStopOrix:
    case NonstopEquiStopper:
    case KingHopper:
    case KnightHopper:
    case MarineKnight:

    case Pawn:
    case BerolinaPawn:
    case ReversePawn:
    case ChinesePawn:
    case MarinePawn:

    case RadialKnight:
    case Treehopper:
    case Leafhopper :
    case GreaterTreehopper:
    case GreaterLeafhopper:

    case Skylla:
    case Charybdis:

    case Dragon:
      identify_leaper_pseudoline();
      break;

    default:
      assert(0);
      break;
  }

  TraceFunctionExit(__func__);
  TraceFunctionResultEnd();
}
Exemple #5
0
static void identify_leaper_pseudoline(void)
{
  square const sq_observer = move_generation_stack[CURRMOVE_OF_PLY(nbply)].departure;
  square const sq_observee = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;
  PushMagicView(sq_observee,sq_observer,sq_observer,sq_observee);
}
Exemple #6
0
/* Validate an observation according to Imitators
 * @return true iff the observation is valid
 */
boolean imitator_validate_observation(slice_index si)
{
  square const sq_observer = move_generation_stack[CURRMOVE_OF_PLY(nbply)].departure;
  boolean result;

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

  TraceWalk(being_solved.board[sq_observer]);TraceEOL();
  switch (being_solved.board[sq_observer])
  {
    case King:
    case ErlKing:
    case Knight:
    case Wesir:
    case Dabbaba:
    case Fers:
    case Alfil:
    case Bucephale:
    case Giraffe:
    case Camel:
    case Zebra:
    case Okapi:
    case Bison:
    case Gnu:
    case Antilope:
    case Squirrel:
    case RootFiftyLeaper:
    case Leap15:
    case Leap16:
    case Leap24:
    case Leap25:
    case Leap35:
    case Leap36:
    case Leap37:

    case Pawn:
    case BerolinaPawn:
    case ReversePawn:
    {
      square const sq_landing = move_generation_stack[CURRMOVE_OF_PLY(nbply)].arrival;
      result = are_all_imitator_arrivals_empty(sq_observer,sq_landing);
      break;
    }

    case Queen:
    case Rook:
    case Bishop:
    case NightRider:
    case Elephant:
    case Waran:
    case Camelrider:
    case Zebrarider:
    case Gnurider:
    case Amazone:
    case Empress:
    case Princess:
    case RookHunter:
    case BishopHunter:
    case WesirRider:
    case FersRider:
      result = avoid_observing_if_imitator_blocked_rider();
      break;

    case Mao:
    case Moa:
      result = avoid_observing_if_imitator_blocked_chinese_leaper();
      break;

    case NonStopEquihopper:
    case NonStopOrix:
      result = avoid_observing_if_imitator_blocked_nonstop_equihopper();
      break;

    case Orix:
      result = avoid_observing_if_imitator_blocked_orix();
      break;

    case EquiHopper:
      if (interceptable_observation[observation_context].vector_index1==0)
        result = avoid_observing_if_imitator_blocked_nonstop_equihopper();
      else
        result = avoid_observing_if_imitator_blocked_orix();
        break;

    case Grasshopper:
    case NightriderHopper:
    case CamelRiderHopper:
    case ZebraRiderHopper:
    case GnuRiderHopper:
    case RookHopper:
    case BishopHopper:
    case KingHopper:
    case KnightHopper:
      result = avoid_observing_if_imitator_blocked_rider_hopper();
      break;

    case ContraGras:
      result = avoid_observing_if_imitator_blocked_contragrasshopper();
      break;

    case GrassHopper2:
      result = avoid_observing_if_imitator_blocked_grasshopper_n(2);
      break;

    case GrassHopper3:
      result = avoid_observing_if_imitator_blocked_grasshopper_n(3);
      break;

    case Elk:
    case RookMoose:
    case BishopMoose:
      result = avoid_observing_if_imitator_blocked_angle_hopper(angle_45);
      break;

    case Eagle:
    case RookEagle:
    case BishopEagle:
      result = avoid_observing_if_imitator_blocked_angle_hopper(angle_90);
      break;

    case Sparrow:
    case RookSparrow:
    case BishopSparrow:
      result = avoid_observing_if_imitator_blocked_angle_hopper(angle_135);
      break;

    default:
      result = true;
      break;
  }

  if (result)
    result = pipe_validate_observation_recursive_delegate(si);

  TraceFunctionExit(__func__);
  TraceFunctionResult("%u",result);
  TraceFunctionResultEnd();
  return result;
}
Exemple #7
0
/* Validate the geometry of observation according to Grid Chess
 * @return true iff the observation is valid
 */
boolean grid_validate_observation_geometry(slice_index si)
{
  return (is_not_in_same_cell(CURRMOVE_OF_PLY(nbply))
          && pipe_validate_observation_recursive_delegate(si));
}
Exemple #8
0
/* Determine the length of a move for the Black Checks condition; the higher the
 * value the more likely the move is going to be played.
 * @return a value expressing the precedence of this move
 */
int blackchecks_measure_length(void)
{
   return move_generation_stack[CURRMOVE_OF_PLY(nbply)].arrival!=nullsquare;
}
Exemple #9
0
boolean bouncy_nightrider_check(validator_id evaluate)
{
  square const sq_target = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;
  clearedgestraversed();
  return rrefnech(sq_target, evaluate);
}
Exemple #10
0
boolean bouncy_knight_check(validator_id evaluate)
{
  square const sq_target = move_generation_stack[CURRMOVE_OF_PLY(nbply)].capture;
  return rrefcech(sq_target, 2, evaluate);
}
Exemple #11
0
/* Find out whether the pawn that has just moved (if any) has the potential
 * of being captured en passant
 * @param sq_multistep_departure departure square of pawn move
 * @return the square avoided by the multistep; initsquare if no multistep
 */
square en_passant_find_potential(square sq_multistep_departure)
{
  square result = initsquare;
  move_effect_journal_index_type const top = move_effect_journal_base[nbply];
  move_effect_journal_index_type const movement = top+move_effect_journal_index_offset_movement;
  piece_walk_type pi_moving = move_effect_journal[movement].u.piece_movement.moving;
  square const sq_arrival = move_generation_stack[CURRMOVE_OF_PLY(nbply)].arrival;

  TraceFunctionEntry(__func__);
  TraceSquare(sq_multistep_departure);
  TraceFunctionParamListEnd();

  if (pi_moving>=Hunter0)
    pi_moving = huntertypes[pi_moving-Hunter0].away;

  switch (pi_moving)
  {
    case Pawn:
    case MarinePawn:
    {
      numvec const dir_forward = trait[nbply]==White ? dir_up : dir_down;
      SquareFlags const double_step = (trait[nbply]==White
                                       ? BIT(WhPawnDoublestepSq)|BIT(WhBaseSq)
                                       : BIT(BlPawnDoublestepSq)|BIT(BlBaseSq));
      if (sq_arrival-sq_multistep_departure==2*dir_forward
          && TSTFLAGMASK(sq_spec[sq_multistep_departure],double_step))
        result = (sq_multistep_departure+sq_arrival) / 2;
      break;
    }

    case BerolinaPawn:
    {
      numvec const dir_forward = trait[nbply]==White ? dir_up : dir_down;
      SquareFlags const double_step = (trait[nbply]==White
                                       ? BIT(WhPawnDoublestepSq)|BIT(WhBaseSq)
                                       : BIT(BlPawnDoublestepSq)|BIT(BlBaseSq));
      numvec const v = sq_arrival-sq_multistep_departure;
      if ((v==2*dir_forward+2*dir_left || v==2*dir_forward+2*dir_right)
          && TSTFLAGMASK(sq_spec[sq_multistep_departure],double_step))
        result = (sq_multistep_departure+sq_arrival) / 2;
      break;
    }

    case ReversePawn:
    {
      numvec const dir_backward = trait[nbply]==Black ? dir_up : dir_down;
      SquareFlags const double_step = (trait[nbply]==Black
                                       ? BIT(WhPawnDoublestepSq)|BIT(WhBaseSq)
                                       : BIT(BlPawnDoublestepSq)|BIT(BlBaseSq));
      if (sq_arrival-sq_multistep_departure==2*dir_backward
          && TSTFLAGMASK(sq_spec[sq_multistep_departure],double_step))
        result = (sq_multistep_departure+sq_arrival) / 2;
      break;
    }

    default:
      break;
  }

  TraceFunctionExit(__func__);
  TraceSquare(result);
  TraceFunctionResultEnd();
  return result;
}
Exemple #12
0
void push_move_copy(numecoup original)
{
  ++current_move[nbply];
  move_generation_stack[CURRMOVE_OF_PLY(nbply)] = move_generation_stack[original];
}
Exemple #13
0
/* Reject generated non-captures
 * @param si identifies the slice
 */
void move_generation_reject_non_captures(slice_index si)
{
  numecoup const base = CURRMOVE_OF_PLY(nbply);
  pipe_move_generation_delegate(si);
  move_generator_filter_noncaptures(base,&always_reject);
}