extends StaticBody2D @onready var sprite_node = $Sprite2D @onready var util = preload("res://scripts/util.gd") var defender_range : float var fire_rate : float var damage : float var target : CharacterBody2D var idle_atlas_coords : Vector2i var attack_atlas_coords : Vector2i var _idle_texture : Texture var _attack_texture : Texture func _ready() -> void: _idle_texture = util.get_tile_texture(idle_atlas_coords) _attack_texture = util.get_tile_texture(attack_atlas_coords) _idle_state() 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 _idle_state() else: target = curr.get_child(0) _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() func _attack_state(): sprite_node.texture = _attack_texture func _idle_state(): sprite_node.texture = _idle_texture