class Rubygoal::Formation

Attributes

lines_definition[RW]
players_position[RW]

Public Class Methods

new() click to toggle source
# File lib/rubygoal/formation.rb, line 7
def initialize
  @players_position = {}

  @lines_definition = {
    defenders: Field::WIDTH / 6,
    def_midfielders: Field::WIDTH / 3,
    midfielders: Field::WIDTH / 2,
    att_midfielders: Field::WIDTH / 3 * 2,
    attackers: Field::WIDTH / 6 * 5,
  }
end

Public Instance Methods

errors() click to toggle source
# File lib/rubygoal/formation.rb, line 30
def errors
  errors = []

  # TODO Check if we need to count for the goalkeeper as well
  if players_position.size != 10
    errors << 'Incorrect number of players, are you missing a name?'
  end

  errors
end
lineup(&block) click to toggle source
# File lib/rubygoal/formation.rb, line 26
def lineup(&block)
  instance_eval(&block)
end
method_missing(method, *args) click to toggle source
# File lib/rubygoal/formation.rb, line 19
def method_missing(method, *args)
  line_name = method.to_s.chomp('=').to_sym
  if lines_definition[line_name]
    set_players_in_custom_line(lines_definition[line_name], args)
  end
end
valid?() click to toggle source
# File lib/rubygoal/formation.rb, line 41
def valid?
  errors.empty?
end

Private Instance Methods

custom_position(&block) click to toggle source
# File lib/rubygoal/formation.rb, line 51
def custom_position(&block)
  CustomPosition.apply(self, &block)
end
line_position_separation(players) click to toggle source
# File lib/rubygoal/formation.rb, line 69
def line_position_separation(players)
  Field::HEIGHT / (players.size + 1)
end
lines(&block) click to toggle source
# File lib/rubygoal/formation.rb, line 47
def lines(&block)
  CustomLines.apply(self, &block)
end
set_players_in_custom_line(position_x, players) click to toggle source
# File lib/rubygoal/formation.rb, line 55
def set_players_in_custom_line(position_x, players)
  base_position = Position.new(position_x, 0)
  separation = line_position_separation(players)

  players.each_with_index do |player, i|
    next if player == :none

    offset = Position.new(0, separation * (i + 1))
    position = base_position.add(offset)

    self.players_position[player] = position
  end
end