extends StaticBody2D @onready var sprite_node = $Sprite2D @onready var util = preload("res://scripts/util.gd") @onready var game_stats_config = preload("res://resources/game_stats_config.tres") var tower_data : Dictionary var tower_key : String var target : CharacterBody2D var _idle_texture : Texture var _attack_texture : Texture func set_tower_stats(tower_index : int): var collision_shape = $Tower/CollisionShape2D collision_shape.shape = CircleShape2D.new() tower_data = game_stats_config.defenders[tower_index].duplicate(true) tower_key = tower_data["desc"] reset_tower_range() func reset_tower_range(): $Tower/CollisionShape2D.shape.radius = tower_data["range"] func reset_tower_sprite(): _idle_texture = util.get_tile_texture(tower_data["sprite_idle"]) _attack_texture = util.get_tile_texture(tower_data["sprite_attacking"]) _idle_state() 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: if target == null && "Crawler" in body.name: select_target() $FireTimer.start() func _attack_state(): sprite_node.texture = _attack_texture func _idle_state(): sprite_node.texture = _idle_texture func apply_upgrade(effects: Dictionary): for key in effects.keys(): if key in tower_data: tower_data[key] = effects[key] reset_tower_range() reset_tower_sprite() # extending classes should override below func _on_fire_timer_timeout() -> void: pass