summaryrefslogtreecommitdiff
path: root/Stages/Stage.gd
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2024-09-08 22:35:06 +0200
committerDaniel Weipert <git@mail.dweipert.de>2024-09-08 22:35:06 +0200
commit4597189f157834c80f56b12b701fd2b2a15c2798 (patch)
treef522e9a58ec756dc27306781da99e828b195c549 /Stages/Stage.gd
parent7d7d845e76f78a87cf87c9464d700e52cd88ce6f (diff)
next commit
Diffstat (limited to 'Stages/Stage.gd')
-rw-r--r--Stages/Stage.gd83
1 files changed, 83 insertions, 0 deletions
diff --git a/Stages/Stage.gd b/Stages/Stage.gd
new file mode 100644
index 0000000..fec5b76
--- /dev/null
+++ b/Stages/Stage.gd
@@ -0,0 +1,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)