summaryrefslogtreecommitdiff
path: root/Tower.gd
diff options
context:
space:
mode:
Diffstat (limited to 'Tower.gd')
-rw-r--r--Tower.gd96
1 files changed, 96 insertions, 0 deletions
diff --git a/Tower.gd b/Tower.gd
new file mode 100644
index 0000000..d8d94ea
--- /dev/null
+++ b/Tower.gd
@@ -0,0 +1,96 @@
+class_name Tower
+extends StaticBody2D
+
+
+signal selected
+
+static var selected_tower: Tower
+
+var is_selected = false :
+ set(value):
+ if value:
+ Tower.selected_tower = self
+ selected.emit()
+ else:
+ if Tower.selected_tower == self:
+ Tower.selected_tower = null
+ get_tree().current_scene.get_node("%Tower").text = ""
+ is_selected = value
+ queue_redraw()
+
+var is_hovered = false :
+ set(value):
+ is_hovered = value
+ queue_redraw()
+
+var mobs_in_range: Array = []
+
+@export var attack_range: int = 16
+@export var attack_power: int = 1
+@export var attack_speed: int = 1
+
+
+func _ready():
+ $Range/CollisionShape2D.shape.radius = attack_range
+ $ShootCooldown.wait_time = attack_speed
+
+
+func _draw():
+ if is_selected:
+ draw_circle(
+ Vector2.ZERO,
+ 8 + attack_range,
+ Color(1, 1, 1, 0.75),
+ false,
+ 1.0
+ )
+ modulate = Color(1.5, 1.5, 1.5)
+ elif is_hovered:
+ if Game.mode == Game.Mode.DEFAULT:
+ draw_circle(
+ Vector2.ZERO,
+ 8 + attack_range,
+ Color(1, 1, 1, 0.5),
+ false,
+ 1.0
+ )
+ modulate = Color(1.25, 1.25, 1.25)
+ else:
+ modulate = Color(1, 1, 1)
+
+
+func _process(_delta: float) -> void:
+ if $ShootCooldown.is_stopped() and not mobs_in_range.is_empty():
+ shoot()
+ $ShootCooldown.start()
+
+
+func _on_input_event(_viewport: Node, event: InputEvent, _shape_idx: int):
+ if Game.mode == Game.Mode.DEFAULT:
+ if event.is_action_pressed("builder_tower_select"):
+ is_selected = true
+ if event.is_action_pressed("builder_cancel"):
+ Game.remove_tower(self)
+
+
+func _on_range_body_entered(body: Node2D) -> void:
+ mobs_in_range.append(body)
+
+func _on_range_body_exited(body: Node2D) -> void:
+ mobs_in_range.remove_at(mobs_in_range.find(body))
+
+
+func _on_mouse_entered() -> void:
+ is_hovered = true
+
+func _on_mouse_exited() -> void:
+ is_hovered = false
+
+
+func shoot():
+ var target = mobs_in_range.pick_random() as Mob
+ target.set_hp(target.hp - 1)
+
+
+func _on_tree_exiting() -> void:
+ is_selected = false