summaryrefslogtreecommitdiff
path: root/scripts/base_defender.gd
blob: 7f13a0fc20bba0203ccdbf3d99ac4c4696d26b8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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")

@onready var _collision_shape = $Tower/CollisionShape2D
@onready var _visual_shape = $Tower/Line2D

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):
	_collision_shape.shape = CircleShape2D.new()
	tower_data = game_stats_config.defenders[tower_index].duplicate(true)
	tower_key = tower_data["desc"]

	_visual_shape.width = 1.0
	_visual_shape.closed = true
	_visual_shape.set_default_color(Color("#0f6b8a"))
	reset_tower_range()

func reset_tower_range():
	$Tower/CollisionShape2D.shape.radius = tower_data["range"]
	_update_visual_circle()

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()

func _update_visual_circle() -> void:
	var radius = _collision_shape.shape.radius
	var points = []
	var segments = 36  # Number of segments to approximate the circle
	for i in range(segments):
		var angle = (i / float(segments)) * 2 * PI
		var x = radius * cos(angle)
		var y = radius * sin(angle)
		points.append(Vector2(x, y))
	_visual_shape.points = points

func hide_collision() -> void:
	_visual_shape.hide()

func show_collision() -> void:
	_visual_shape.show()

# extending classes should override below
func _on_fire_timer_timeout() -> void:
	pass