diff options
Diffstat (limited to 'Stages/Wintermaul/path_manager.gd')
-rw-r--r-- | Stages/Wintermaul/path_manager.gd | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/Stages/Wintermaul/path_manager.gd b/Stages/Wintermaul/path_manager.gd new file mode 100644 index 0000000..14d1bfc --- /dev/null +++ b/Stages/Wintermaul/path_manager.gd @@ -0,0 +1,48 @@ +class_name PathManager +extends Node + + +signal path_grid_changed + +@export var map: TileMapLayer +@export var collision_maps: Array[TileMapLayer] + +var path_grid: AStarGrid2D +var last_solid_set_points: Array[Vector2] + + +func _ready() -> void: + path_grid = AStarGrid2D.new() + path_grid.region = map.get_used_rect() + path_grid.cell_size = map.tile_set.tile_size + path_grid.offset = map.tile_set.tile_size / 2 + path_grid.diagonal_mode = AStarGrid2D.DIAGONAL_MODE_AT_LEAST_ONE_WALKABLE + path_grid.update() + + for m in collision_maps: + for cell in m.get_used_cells(): + var tile_data = m.get_cell_tile_data(cell) + if tile_data.get_collision_polygons_count(0) > 0: + path_grid.set_point_solid(cell, true) + + +func fill_tower_region(tower: Tower, solid = true): + var region = tower.get_region().size.snapped(path_grid.cell_size) + var tower_position = map.local_to_map(tower.global_position) + + last_solid_set_points = [] + if solid: + for x in (region / path_grid.cell_size).x + 1: + for y in (region / path_grid.cell_size).y + 1: + last_solid_set_points.append( + map.map_to_local(tower_position + Vector2i(x, y)) + ) + + path_grid.fill_solid_region( + Rect2i( + map.local_to_map(tower.global_position), + (region / path_grid.cell_size) + ), + solid + ) + path_grid_changed.emit() |