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
|