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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
class_name Stage
extends Node
signal path_grid_changed
static var map: TileMapLayer
static var path_grid: AStarGrid2D
static var last_solid_set_points: Array[Vector2]
static var towers: Node
static var units: Node
static var spawn: Spawn
static var hud: HUD
func _ready() -> void:
Client.initialize_stage(self)
map = get_node("%Map")
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()
#towers = get_node("%Towers") # y-sort?
towers = self
#units = get_node("%Units") # y-sort?
units = self
spawn = get_node("%Spawn")
hud = get_node("%HUD")
assert(get_node("%StateManager"), "StateManager missing")
assert(get_node("%StateManager").get_children().size() > 0, "StateManager has no States")
func place_tower(tower: Tower, position: Vector2):
if tower.owner_id != 1:
var id = str(tower.owner_id)
tower.get_node("Sprite2D").modulate = Color(
int(id.substr(0, 3)) / 255,
int(id.substr(3, 3)) / 255,
int(id.substr(6, 3)) / 255
)
tower.global_position = position
fill_tower_region(tower, true)
towers.add_child(tower)
path_grid_changed.emit()
func destroy_tower(tower: Tower):
fill_tower_region(tower, false)
tower.queue_free()
path_grid_changed.emit()
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
)
@warning_ignore("shadowed_variable")
func spawn_unit(unit: Unit, _spawn: Spawn):
units.add_child(unit)
|