summaryrefslogtreecommitdiff
path: root/Stages/Wintermaul/path_manager.gd
blob: 14d1bfc6b53d41323099e8d5a027bbc2ba5c5224 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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()