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()