class Abstracta::World

Attributes

age[R]
developer[R]
grid[R]
territories[R]

Public Class Methods

new(geometry=[100,100], opts={}) click to toggle source

def_delegators :compass, :distance_from

# File lib/abstracta/world.rb, line 10
def initialize(geometry=[100,100], opts={})
  @grid            = Grid.new(geometry)
  #@compass         = Compass.default
  @density         = opts.delete(:density) { 0.05 }

  @territory_count = opts.delete(:territory_count) { width * height * @density }
  @territories = []
  @territories = create_territories(@territory_count)
  update_map

  @age = 0

  @developer = WorldDeveloper.new(self)
end

Public Instance Methods

age!() click to toggle source
# File lib/abstracta/world.rb, line 35
def age!
  @age = @age + 1
end
available_adjacent(territory) click to toggle source
# File lib/abstracta/world.rb, line 69
def available_adjacent(territory)
  @grid.clip territory.adjacent.reject(&method(:occupied?)) # { |xy| occupied.include?(xy) } # & available # - occupied
end
compute_occupied() click to toggle source
# File lib/abstracta/world.rb, line 57
def compute_occupied
  territories.map(&:occupants).flatten.map(&:location)
end
compute_projected_targets(territory, n=territory.growth) click to toggle source
# File lib/abstracta/world.rb, line 65
def compute_projected_targets(territory, n=territory.growth)
  available_adjacent(territory).take(n)
end
create_territories(n=1) click to toggle source
# File lib/abstracta/world.rb, line 30
def create_territories(n=1)
  seeds = @grid.sample(n)
  Array.new(n) { territory_class.new([seeds.pop]) }
end
occupied() click to toggle source

def update_territories

@territories.each do |territory|
  update_map
  targets = compute_projected_targets(territory)
  territory.step(targets) 
end

end

# File lib/abstracta/world.rb, line 53
def occupied
  @occupied ||= compute_occupied
end
occupied?(xy) click to toggle source
# File lib/abstracta/world.rb, line 61
def occupied?(xy)
  @occupied.include?(xy)
end
territory_class() click to toggle source
# File lib/abstracta/world.rb, line 29
def territory_class; Territory end
update_map() click to toggle source
# File lib/abstracta/world.rb, line 25
def update_map
  @occupied = compute_occupied
end