summaryrefslogtreecommitdiff
path: root/Tower.gd
blob: d8d94ea30f6b97b701583a2790dcd5060b9fd360 (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
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