summaryrefslogtreecommitdiff
path: root/scripts/base_defender.gd
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/base_defender.gd')
-rw-r--r--scripts/base_defender.gd49
1 files changed, 49 insertions, 0 deletions
diff --git a/scripts/base_defender.gd b/scripts/base_defender.gd
new file mode 100644
index 0000000..66be11d
--- /dev/null
+++ b/scripts/base_defender.gd
@@ -0,0 +1,49 @@
+extends StaticBody2D
+
+@onready var sprite_node = $Sprite2D
+
+var defender_range : float
+var fire_rate : float
+var damage : int
+var target : CharacterBody2D
+
+func _on_fire_timer_timeout() -> void:
+ # extending classes override here
+ pass
+
+func select_target() -> void:
+ var targets : Array = _find_targets()
+
+ # this is all to select the furthest target on the track
+ var curr : PathFollow2D = null
+ for i in targets:
+ if curr == null:
+ curr = i.get_node("../")
+ else:
+ if i.get_parent().get_progress() > curr.get_progress():
+ curr = i.get_node("../")
+
+ _update_state_machine(curr)
+
+func _find_targets() -> Array:
+ var targets : Array = get_node("Tower").get_overlapping_bodies()
+ var tmp : Array = []
+ for i in targets:
+ if "Crawler" in i.name:
+ tmp.append(i)
+ return tmp
+
+func _update_state_machine(curr : PathFollow2D) -> void:
+ if (curr == null):
+ target = null
+ sprite_node.idle_state()
+ else:
+ target = curr.get_child(0)
+ sprite_node.attack_state()
+
+func _on_tower_body_entered(_body: Node2D) -> void:
+ var old_target : CharacterBody2D = target
+ select_target()
+ if old_target == null && old_target != target:
+ $FireTimer.start(fire_rate)
+ _on_fire_timer_timeout()