class XenosEnigma::Radar

Radar will orchestrate scan of radar data, xenos detection and echo of those findings

Public Class Methods

new(data = nil) click to toggle source
# File lib/xenos_enigma/radar.rb, line 12
def initialize(data = nil)
  @data = (data || SCAN_DATA).split(/\n/)
  @known_xenos = load_all_known_xenos
  @hit_collector = XenosEnigma::HitCollector.new
end

Public Instance Methods

echo() click to toggle source
# File lib/xenos_enigma/radar.rb, line 32
def echo
  echo_width  = @data.first.size - 1
  echo_height = @data.size - 1
  print "\033[33m"

  (0..echo_height).each do |echo_y|
    (0..echo_width).each do |echo_x|
      hit_data = @hit_collector.detection_data(echo_x, echo_y)
      print hit_data || '-'
    end
    puts
  end
end
scan() click to toggle source
# File lib/xenos_enigma/radar.rb, line 18
def scan
  @data.each_with_index do |scan_row, scan_position_y|
    (0..scan_row.length).each do |scan_position_x|
      next if @hit_collector.already_detected?(scan_position_x, scan_position_y)

      @known_xenos.each do |xeno|
        partial = scan_row_partial(scan_row, scan_position_x, xeno.ship_width)
        hit = xeno.analyze?(partial, look_ahead_data(scan_position_x, scan_position_y, xeno))
        @hit_collector.push(hit, scan_position_x, scan_position_y) if hit
      end
    end
  end
end

Private Instance Methods

load_all_known_xenos() click to toggle source
# File lib/xenos_enigma/radar.rb, line 62
def load_all_known_xenos
  xenox_clazzes = XenosEnigma::Xenos.constants.reject { |xc| xc.downcase.eql?(:base) }
  xenox_clazzes.collect { |xc| XenosEnigma::Xenos.const_get(xc).new }
end
look_ahead_data(position_x, position_y, xeno) click to toggle source
# File lib/xenos_enigma/radar.rb, line 48
def look_ahead_data(position_x, position_y, xeno)
  results = []
  scan_to_y = [(position_y + xeno.ship_height), @data.size].min - 1
  (position_y..scan_to_y).each do |scan_y|
    partial = scan_row_partial(@data[scan_y], position_x, xeno.ship_width)
    results.push(partial)
  end
  results
end
scan_row_partial(scan_row, position_x, x_offset) click to toggle source
# File lib/xenos_enigma/radar.rb, line 58
def scan_row_partial(scan_row, position_x, x_offset)
  scan_row[position_x..(position_x + x_offset - 1)]
end