class LoveLetterApplication::Results::ProcessNextPlayerTurn

Public Instance Methods

call(game_board:, change_orders:) click to toggle source
# File lib/love_letter_application/results/process_next_player_turn.rb, line 17
def call(game_board:, change_orders:)
  if game_board.draw_pile.empty?
    return process_round_complete_by_depleted_deck.(
      game_board: game_board,
      change_orders: change_orders)
  end
  next_player_id = get_next_player_id_from(game_board)
  card_id = game_board.draw_pile.first.id.to_i
  game_board = next_player_draw_card.(
    game_board: game_board,
    next_player_id: next_player_id)
  process_next_turn_options.(
    game_board: game_board,
    change_orders: change_orders
      .push(get_next_player_node.(player_id: next_player_id))
      .push(get_drawn_card_node.(player_id: next_player_id, card_id: card_id))
      .push(get_result_game_board_node.(game_board: game_board)))
end

Private Instance Methods

get_next_player_id_from(game_board) click to toggle source
# File lib/love_letter_application/results/process_next_player_turn.rb, line 37
def get_next_player_id_from(game_board)
  current_player_id = game_board.current_player_id.to_i
  current_player = game_board.players.find{|player| player.id.to_i.eql?(current_player_id)}
  possible_players = game_board
    .players
    .select(&:active?)
    .sort{|p, q| p.seat.to_i <=> q.seat.to_i}
    .reject{|player| player.id.to_i.eql?(current_player_id)}
  #get first active player with higher seat number than current player
  next_player = possible_players
    .select{|player| player.seat.to_i > current_player_id.to_i}
    .first
  #if no such player, "wrap around" and get active player with lowest seat number
  next_player || possible_players.first

  next_player.id.to_i
end