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
|
class_name StateDefault
extends State
@export var selection_manager: SelectionManager
@export var selection_rectangle: Area2D
var hovered_towers: Dictionary[Tower, bool]
func _ready() -> void:
Client.placed_tower.connect(_on_placed_tower)
selection_rectangle.hover_entered.connect(_on_selection_rectangle_hover_entered)
selection_rectangle.hover_exited.connect(_on_selection_rectangle_hover_exited)
func _state_enter():
selection_rectangle.is_enabled = true
func _state_exit():
selection_rectangle.is_enabled = false
hovered_towers.clear()
queue_redraw()
Input.set_default_cursor_shape(Input.CURSOR_ARROW)
func _input(event: InputEvent) -> void:
if event.is_action_pressed("build_mode_start"):
state_manager.set_state(state_manager.state_build)
if event.is_action_pressed("select"):
if Unit.selected_unit:
Unit.selected_unit.is_selected = false
func _unhandled_input(event: InputEvent) -> void:
# deselect
if event.is_action_pressed("select"):
# if not multi selecting
if not event.is_double_click() and not Input.is_action_pressed("select_multiple"):
for tower: Tower in selection_manager.get_nodes().duplicate():
tower.is_selected = false
func _draw() -> void:
for tower: Tower in hovered_towers.keys():
draw_circle(
tower.global_position + Vector2(Client.current_stage.map.tile_set.tile_size) / tower.scale,
8 + tower.components.get(TowerComponent.ComponentType.Range).range,
Color(1, 1, 1, 0.5),
false,
1.0
)
tower.modulate = Color(1.25, 1.25, 1.25)
func _on_placed_tower(tower: Tower) -> void:
tower.hovered.connect(_on_tower_hovered.bind(tower))
tower.selected_primary.connect(_on_tower_selected.bind(tower))
tower.double_clicked.connect(_on_tower_double_clicked.bind(tower))
func _on_tower_hovered(is_hovered: bool, tower: Tower) -> void:
if state_manager.current_state != self:
return
if selection_rectangle.is_active:
return
if is_hovered:
hovered_towers.set(tower, true)
else:
hovered_towers.erase(tower)
queue_redraw()
func _on_tower_selected(tower: Tower) -> void:
if state_manager.current_state != self:
return
if Input.is_action_pressed("select_multiple") and tower.is_selected:
tower.is_selected = false
else:
Client.select_tower(tower)
func _on_tower_double_clicked(tower: Tower) -> void:
if state_manager.current_state != self:
return
Client.multi_select(tower.collision_layer)
func _on_selection_rectangle_hover_entered(node: Node2D) -> void:
if state_manager.current_state != self:
return
hovered_towers.set(node, true)
queue_redraw()
func _on_selection_rectangle_hover_exited(node: Node2D) -> void:
if state_manager.current_state != self:
return
hovered_towers.erase(node)
queue_redraw()
|