summaryrefslogtreecommitdiff
path: root/Game/States/Default/StateDefault.gd
blob: 8bc378351e86ffff2e5a66ed9ef13866c582baf5 (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
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()