Skip to content

Commit

Permalink
units moving over terrain
Browse files Browse the repository at this point in the history
  • Loading branch information
mswieboda committed Jul 10, 2019
1 parent a61d521 commit 8f8cf0b
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 18 deletions.
4 changes: 1 addition & 3 deletions src/geo_wars/map.cr
Expand Up @@ -31,8 +31,6 @@ module GeoWars
selected_unit = @units.find { |unit| unit.selected? }

if selected_unit
selected_unit.update_moves(@cells, @cells_x, @cells_y)

valid_move_deltas.select! do |move|
selected_unit.moves.any? do |unit_move|
unit_move[:x] == @cursor.x + move[:x] && unit_move[:y] == @cursor.y + move[:y]
Expand All @@ -48,7 +46,7 @@ module GeoWars

if pre_selected_unit
@units.select { |u| u != pre_selected_unit && u.selected? }.each(&.unselect)
pre_selected_unit.select
pre_selected_unit.select(@cells, @cells_x, @cells_y)
else
@units.select(&.selected?).each(&.unselect)
end
Expand Down
15 changes: 15 additions & 0 deletions src/geo_wars/terrain.cr
Expand Up @@ -20,6 +20,21 @@ module GeoWars
end
end

def moves
case self
when Field
1
when Road
1
when Water
0
when Mountain
2
else
0
end
end

def self.random
Terrain.values.sample
end
Expand Down
47 changes: 32 additions & 15 deletions src/geo_wars/units/unit.cr
Expand Up @@ -18,9 +18,13 @@ module GeoWars
@selected = false
@selected_border_timer = Timer.new(SELECTED_BORDER_TIMER)
@moves_relative = Array(NamedTuple(x: Int32, y: Int32)).new
@moves_relative_default = Array(NamedTuple(x: Int32, y: Int32)).new
@moves_relative_default = default_relative_moves
@moves_relative = @moves_relative_default
@moves_relative_initial = [
{x: 0, y: -1},
{x: -1, y: 0},
{x: 0, y: 0},
{x: 0, y: 1},
{x: 1, y: 0},
]
end

def update(frame_time)
Expand Down Expand Up @@ -89,22 +93,33 @@ module GeoWars
end
end

def default_relative_moves
(-@max_movement..@max_movement).to_a.flat_map do |x|
max = @max_movement - x.abs
def update_moves(cells, cells_x, cells_y)
@moves_relative = @moves_relative_initial.select do |move_realtive|
moves = @max_movement
move = move_absolute(move_realtive)
cell = cells.find { |c| c.x == move[:x] && c.y == move[:y] }

if cell
in_bounds = move[:x] >= 0 && move[:x] < cells_x && move[:y] >= 0 && move[:y] < cells_y

terrain_moves = terrain_moves(cell.terrain)

if terrain_moves > 0
moves -= terrain_moves
moveable = moves > 0
else
moveable = false
end

(-max..max).to_a.flat_map do |y|
{x: x, y: y}
in_bounds && moveable
else
false
end
end
end

def update_moves(cells, cells_x, cells_y)
@moves_relative = @moves_relative_default.select do |move_realtive|
move = move_absolute(move_realtive)

move[:x] >= 0 && move[:x] < cells_x && move[:y] >= 0 && move[:y] < cells_y
end
def terrain_moves(terrain)
terrain.moves
end

def move_absolute(move)
Expand All @@ -120,8 +135,10 @@ module GeoWars
@y = y
end

def select
def select(cells, cells_x, cells_y)
@selected = !@selected

update_moves(cells, cells_x, cells_y)
end

def unselect
Expand Down

0 comments on commit 8f8cf0b

Please sign in to comment.