From 5b35174ffab42f0331f1a6527ef6bbab7a3dbdcb Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Sat, 21 Dec 2024 14:15:11 +0100 Subject: next commit --- Stages/Wintermaul/HUD.gd | 215 ++++++++++++++++------------------------- Stages/Wintermaul/hud_tower.gd | 7 +- 2 files changed, 83 insertions(+), 139 deletions(-) (limited to 'Stages') diff --git a/Stages/Wintermaul/HUD.gd b/Stages/Wintermaul/HUD.gd index 34fc0ea..62a5abd 100644 --- a/Stages/Wintermaul/HUD.gd +++ b/Stages/Wintermaul/HUD.gd @@ -2,13 +2,6 @@ class_name HUD extends CanvasLayer -var selection_groups := {} -var selected_group := "": - set(value): - redraw_multiselect(selected_group, value) - selected_group = value - redraw_select(selection_groups[selected_group][0]) - @onready var time: Label = %Time @onready var money: Label = %Money @onready var income: Label = %Income @@ -39,94 +32,74 @@ func _ready(): %TowerConfigurationsContainer.visible = false ) - # multi select + # multi select setup %SelectionContainer.visible = false %MultiSelectionContainer.visible = false - Client.placed_tower.connect(func(tower: Tower): - if tower.owner_id == multiplayer.get_unique_id(): - tower.selected.connect(func(): - var multi_select_hud_data = TextureRect.new() - multi_select_hud_data.name = tower.name - multi_select_hud_data.modulate = Color(0.5, 0.5, 0.5) - multi_select_hud_data.expand_mode = TextureRect.EXPAND_IGNORE_SIZE - multi_select_hud_data.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED - multi_select_hud_data.custom_minimum_size = Vector2(32, 64) - var texture = AtlasTexture.new() - texture.atlas = preload("res://Towers/Assets/spritesheet.png") - texture.region = Rect2(5, 1, 62, 95) - multi_select_hud_data.texture = texture - - if not tower.selection_group_id in selection_groups: - selection_groups[tower.selection_group_id] = [] - selection_groups[tower.selection_group_id].append(tower) - multi_select_hud_data.add_to_group(tower.selection_group_id) - - if Tower.selected_towers.size() == 1: - %SelectionContainer.visible = true - %MultiSelectionContainer.visible = false - - %MultiSelectionList.add_child(multi_select_hud_data) - selected_group = tower.selection_group_id - elif Tower.selected_towers.size() > 1: - %MultiSelectionContainer.visible = true - - %MultiSelectionList.add_child(multi_select_hud_data) - - redraw_multiselect("", selected_group) - - redraw_select(tower) - ) + + # add tower to selection + Client.selection.added_to_group.connect(func(nodes: Array[Node], id: String): + for tower: Tower in nodes: + var multi_select_hud_data = TextureRect.new() + multi_select_hud_data.modulate = Color(0.5, 0.5, 0.5) + multi_select_hud_data.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + multi_select_hud_data.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + multi_select_hud_data.custom_minimum_size = Vector2(32, 64) + var texture = AtlasTexture.new() + texture.atlas = preload("res://Towers/Assets/spritesheet.png") + texture.region = Rect2(5, 1, 62, 95) + multi_select_hud_data.texture = texture + + multi_select_hud_data.set_meta("tower", tower) + tower.set_meta("multi_select_hud", multi_select_hud_data) + + multi_select_hud_data.add_to_group(id) + %MultiSelectionList.add_child(multi_select_hud_data) + + if Client.selection.node_count == 1: + %SelectionContainer.visible = true + %MultiSelectionContainer.visible = false + + elif Client.selection.node_count > 1: + %MultiSelectionContainer.visible = true + + redraw_multiselect() + redraw_select(tower) + ) + + # remove tower from selection + Client.selection.removed_from_group.connect(func(nodes: Array[Node], _id: String): + for tower: Tower in nodes: + if Client.selection.node_count == 0: + %SelectionContainer.visible = false + %MultiSelectionContainer.visible = false + + elif Client.selection.node_count == 1: + %MultiSelectionContainer.visible = false + %SelectionContainer.visible = true + + # catch free error for selecting in quick succcession by double click + if is_instance_valid(tower.get_meta("multi_select_hud")): + tower.get_meta("multi_select_hud").queue_free() - tower.deselected.connect(func(): - if Tower.selected_towers.size() == 0: - %SelectionContainer.visible = false - %MultiSelectionContainer.visible = false - - for child in %MultiSelectionList.get_children(): - child.queue_free() - elif Tower.selected_towers.size() == 1: - %MultiSelectionContainer.visible = false - %SelectionContainer.visible = true - - var node = %MultiSelectionList.get_node_or_null(NodePath(tower.name)) - if node: - node.queue_free() - elif Tower.selected_towers.size() > 1: - # only remove deselected tower from list - var node = %MultiSelectionList.get_node_or_null(NodePath(tower.name)) - if node: # when double click selecting in quick succession not found error - node.queue_free() - - if tower.selection_group_id in selection_groups: - selection_groups[tower.selection_group_id].erase(tower) - if selection_groups[tower.selection_group_id].is_empty(): - selection_groups.erase(tower.selection_group_id) - ) + tower.remove_meta("multi_select_hud") + ) + + # move tower to new selection group + Client.selection.moved_to_group.connect(func(nodes: Array[Node], previous_id: String, new_id: String): + for tower: Tower in nodes: + tower.get_meta("multi_select_hud").remove_from_group(previous_id) + tower.get_meta("multi_select_hud").add_to_group(new_id) - tower.selection_group_id_changed.connect(func(previous_id: String): - #Client.selection.change_selection_group_id([tower], previous_id, tower.selection_group_id) - - if not tower.selection_group_id in selection_groups: - selection_groups[tower.selection_group_id] = [] - selection_groups[tower.selection_group_id].append(tower) - %MultiSelectionList.get_node(NodePath(tower.name)).add_to_group(tower.selection_group_id) - - selection_groups[previous_id].erase(tower) - if selection_groups[previous_id].is_empty(): - selection_groups.erase(previous_id) - if previous_id == selected_group: - selected_group = tower.selection_group_id - %MultiSelectionList.get_node(NodePath(tower.name)).remove_from_group(previous_id) - - if tower.name == selection_groups[tower.selection_group_id][0].name: - redraw_select(tower) - ) + if Client.selection.has_node_in_group(tower, new_id): + redraw_select(tower) + redraw_multiselect(previous_id, new_id) ) - Client.multi_select_finished.connect(func(_nodes): - var keys = get_ordered_group_keys() - if keys.size() > 0: - selected_group = keys[0] + # redraw on selected group change + Client.selection.selected_group_changed.connect(func(previous_id: String, new_id: String): + if Client.selection.get_selected_nodes(): + redraw_select(Client.selection.get_selected_nodes()[0]) + redraw_multiselect(previous_id, new_id) ) @@ -138,70 +111,44 @@ func _input(event: InputEvent): team_bottom.visible = not team_bottom.visible if event.is_action_pressed("selection_cycle") and %MultiSelectionContainer.visible: - var keys = get_ordered_group_keys() - var current_idx = keys.find(selected_group) - selected_group = keys[(current_idx + 1) % keys.size()] + if Input.is_action_pressed("reverse_cycle_direction"): + Client.selection.go_to_previous() + else: + Client.selection.go_to_next() func redraw_select(tower: Tower): %TowerData.current_tower = tower -func redraw_multiselect(previous_group: String, new_group: String): +func redraw_multiselect(previous_group: String = "", new_group: String = Client.selection.selected_group): var idx = 0 - for group_key in get_ordered_group_keys(): - var group = selection_groups[group_key] - for node in group: - var selection_node = %MultiSelectionList.get_node_or_null(NodePath(node.name)) - if selection_node: # when double click selecting in quick succession not found error - %MultiSelectionList.move_child(selection_node, idx) + for id in Client.selection.get_ordered_group_ids(): + var group = Client.selection.selection_groups[id] + for node: Tower in group: + # when double click selecting in quick succession not found error + if (node.has_meta("multi_select_hud") and + is_instance_valid(node.get_meta("multi_select_hud")) + ): + %MultiSelectionList.move_child(node.get_meta("multi_select_hud"), idx) idx += 1 + # wait for nodes to be in the correct groups + await get_tree().process_frame + for node in get_tree().get_nodes_in_group(previous_group): node.modulate = Color(0.5, 0.5, 0.5) - var tower = Client.current_stage.get_node_or_null("%Towers/" + node.name) + var tower = node.get_meta("tower") if tower: tower.is_highlighted = false + for node in get_tree().get_nodes_in_group(new_group): node.modulate = Color(1.0, 1.0, 1.0) - var tower = Client.current_stage.get_node_or_null("%Towers/" + node.name) + var tower = node.get_meta("tower") if tower: tower.is_highlighted = true -func get_ordered_group_keys() -> Array: - var keys = selection_groups.keys() - keys.sort_custom(func(a, b): - var group_a = selection_groups[a] - var group_b = selection_groups[b] - - return group_a.size() > group_b.size() - ) - keys.sort_custom(func(a, b): - var group_a = selection_groups[a] - var group_b = selection_groups[b] - var node_a = group_a[0] - var node_b = group_b[0] - var level_a = 0 - var level_b = 0 - - for component in node_a.components.values(): - level_a += component.level - for component in node_b.components.values(): - level_b += component.level - - return level_a > level_b - ) - keys.sort_custom(func(a, b): - var group_a = selection_groups[a] - var group_b = selection_groups[b] - - return group_a[0].components.size() > group_b[0].components.size() - ) - - return keys - - func _on_build_mode_button_gui_input(event: InputEvent) -> void: if event.is_action_pressed("select"): if Client.state is StateDefault: diff --git a/Stages/Wintermaul/hud_tower.gd b/Stages/Wintermaul/hud_tower.gd index d24443b..7a7ef69 100644 --- a/Stages/Wintermaul/hud_tower.gd +++ b/Stages/Wintermaul/hud_tower.gd @@ -36,10 +36,7 @@ func redraw_components(): func get_selected_towers() -> Array: - var hud: HUD = Client.current_stage.get_node("%HUD") - - # TODO: key not found error sometimes? - return hud.selection_groups[hud.selected_group].duplicate() + return Client.selection.get_selected_nodes().duplicate() func _on_range_gui_input(event: InputEvent) -> void: @@ -180,7 +177,7 @@ func _on_range_level_up_pressed() -> void: Client.current_stage.add_status_message("Not enough money to level up") return - for tower: Tower in towers: + for tower in towers: var tower_component: TowerComponent = tower.components.get(TowerComponent.ComponentType.Range) tower_component.level += 1 -- cgit v1.2.3