summaryrefslogtreecommitdiff
path: root/Tower.gd
blob: 9d7f8707a083ba8e9ad436d66e0b388df6d75ed5 (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
105
106
107
108
109
110
111
112
113
114
115
116
class_name Tower
extends StaticBody2D


signal selected
signal deselected

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
			deselected.emit()
			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 is_melee_range():
	return attack_range <= Game.map.tile_set.tile_size.x


func shoot():
	var target = mobs_in_range.pick_random() as Mob
	
	if is_melee_range():
		target.set_hp(target.hp - 1)
	else: # TODO
		target.set_hp(target.hp - 1)


func get_region():
	var collision_shape := $CollisionShape2D
	var shape = $CollisionShape2D.shape as RectangleShape2D
	
	return Rect2(
		collision_shape.position,
		shape.size.snapped(Game.map.tile_set.tile_size)
	)


func _on_tree_exiting() -> void:
	is_selected = false