From ce845b7be611708e3af9b052b48fe2ec6f42ad44 Mon Sep 17 00:00:00 2001 From: Tiger Jove Date: Fri, 16 Jan 2026 14:09:07 +0100 Subject: [PATCH] fix: board dead code removed, cards can now be dragged again --- src/logic-scenes/board/card-board.gd | 183 +++--------------- ...cky_note_panel.gd => sticky_note_panel.gd} | 0 ..._panel.gd.uid => sticky_note_panel.gd.uid} | 0 ...note_panel.tscn => sticky_note_panel.tscn} | 2 +- 4 files changed, 32 insertions(+), 153 deletions(-) rename src/logic-scenes/board/{empty_sticky_note_panel.gd => sticky_note_panel.gd} (100%) rename src/logic-scenes/board/{empty_sticky_note_panel.gd.uid => sticky_note_panel.gd.uid} (100%) rename src/logic-scenes/board/{empty_sticky_note_panel.tscn => sticky_note_panel.tscn} (86%) diff --git a/src/logic-scenes/board/card-board.gd b/src/logic-scenes/board/card-board.gd index ca4d252..fd57f98 100644 --- a/src/logic-scenes/board/card-board.gd +++ b/src/logic-scenes/board/card-board.gd @@ -1,14 +1,6 @@ class_name CardBoard extends PanelContainer enum {NAVIGATE, ASSIGN, DRAG} -enum Error { - OK, - OUT_OF_BOUNDS, - ILLEGAL_STATE, - MISSING -} - -const is_board := true var focus_stickies:bool = true: set(stickies): @@ -26,25 +18,17 @@ var focus_stickies:bool = true: current_dropzone_id = current_dropzone_id var focused := false: - set(focus): + set(value): + if focused == value: + return var was_focused := focused - if focus: - focused = true - get_tree().call_group("interactables", "collapse") - current_dropzone_id = 0 - current_sticky_note_id = 0 - focus_stickies = true + focused = value + + if focused: + _on_board_focused() else: - focused = false - if is_node_ready(): - if focus: - process_mode = Node.PROCESS_MODE_INHERIT - else: - process_mode = Node.PROCESS_MODE_DISABLED - for sticky in dropzone.get_children(): - if sticky is StickyNote: - sticky.is_dragged = false - visible = focused + _on_board_unfocused() + # Emit closed signal when transitioning from focused to unfocused if was_focused and not focused: closed.emit() @@ -56,18 +40,8 @@ var dropzone_size: Vector2 @onready var sticky_note_container := $HBoxContainer/ScrollContainer/VBoxContainer @onready var current_context:int = NAVIGATE: set(context): - #if current_context == ASSIGN and !context == ASSIGN: - # sticky_note_container.get_child(current_sticky_note_id).clear_if_empty() - #match context: - # NAVIGATE: - # _return_sticky_notes_to_panels() - # DRAG: - # pass - # ASSIGN: - # pass current_context = context @onready var instructions := $instructions_panel/HBoxContainer/cards_remaining -@onready var timer := $Timer var mementos_collected: int = 0: set(mementos): @@ -131,8 +105,7 @@ var mementos_collected: int = 0: if sticky_note_container.get_child(i).get_child_count() == 1: currently_active_node = sticky_note_container.get_child(i).get_child(0) -var last_save_dict: Dictionary -var text_recovery: Dictionary + signal board_completed signal closed @@ -152,27 +125,35 @@ func _ready(): populate_board(["c_comic_heroes", 'c_teasing', "p_agent_q", "p_good_intended"]) populate_board(["c_out_of_world", 'c_confusion', "p_outer_conflict", "p_unique"]) - focused = focused - get_viewport().gui_focus_changed.connect(reclaim_lost_focus) - #FIXME properly implement board recovery - #timer.timeout.connect(validate_board) - #timer.start() - #await get_tree().process_frame - #last_save_dict = get_save_dict() +## Called when board receives focus +func _on_board_focused() -> void: + get_tree().call_group("interactables", "collapse") + current_dropzone_id = 0 + current_sticky_note_id = 0 + focus_stickies = true + visible = true + if is_node_ready(): + process_mode = Node.PROCESS_MODE_INHERIT + + +## Called when board loses focus +func _on_board_unfocused() -> void: + visible = false + if is_node_ready(): + process_mode = Node.PROCESS_MODE_DISABLED + # Stop any active dragging + for sticky in dropzone.get_children(): + if sticky is StickyNote: + sticky.is_dragged = false func reclaim_lost_focus(_thief): if focused: grab_focus() -#func _process(delta): -# # drops dragged area when Mouse is no longer pressed. -# if focused and !Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) and current_context == DRAG: -# currently_active_node.is_dragged = false - ## Will be used later to spawn Cards and Post-Its and remember them in the dictionary func populate_board(card_names: Array[StringName]): mementos_collected += 1 @@ -189,7 +170,6 @@ func populate_board(card_names: Array[StringName]): # marking the first sticky as random picks new_sticky_note.picked_random = new_sticky_note.name == card_names[3] - #currently_active_node = area_dict["dropzone_content"][0] # set first Card as currently selected node by default currently_active_node = dropzone.get_child(0) func add_card(card: Card, re_parent:bool = true): @@ -371,13 +351,6 @@ func give_lore_feedback(): $AnimationPlayer.play("complete") complete = true -func is_board_lore() -> bool: - for card in dropzone.get_children(): - if card is Card: - if card.has_sticky_note_attached(): - if not card.current_sticky_note.sticky_id.contains(card.card_id): return false - return true - # Mark area that was hovered over as currently selected func handle_hover(to_handle: Area2D) -> void: if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): return @@ -524,63 +497,8 @@ func _input(event) -> void: current_context = ASSIGN focus_stickies = true current_sticky_note_id = current_sticky_note_id - -# -# else: -# if current_context == ASSIGN: -# if not dropzone.get_child(current_dropzone_id) is Card: return -# var card:Card = dropzone.get_child(current_dropzone_id) -# -# if dropzone.get_child(current_dropzone_id) is Card: -# var card:Card = dropzone.get_child(current_dropzone_id) -# if current_context == ASSIGN: # to assign it to a card -# if card.has_sticky_note_attached(): -# currently_active_node = card.exchange_sticky_note_with(currently_active_node) -# if not try_select_nearest_empty_card(currently_active_node.global_position): -# current_dropzone_id = find_first_free_card() -# else: -# card.attach_sticky_note(sticky_note_container.get_child(current_sticky_note_id).attached_sticky_note) -# current_context = NAVIGATE -# for panel: StickyNotePanel in sticky_note_container.get_children(): -# panel.clear_if_empty() -# focus_stickies = not focus_stickies -# if not try_select_nearest_empty_card(currently_active_node.global_position): -# current_dropzone_id = find_first_free_card() -# check_board_comnpletion() -# return -# else: -# if !focus_stickies and card.has_sticky_note_attached(): -# pass -# else: -# if not try_select_nearest_empty_card(currently_active_node.global_position): -# current_dropzone_id = find_first_free_card() -# -# current_context = ASSIGN -# focus_stickies = !focus_stickies -# if focus_stickies: -# current_sticky_note_id = current_sticky_note_id -# else: -# current_dropzone_id = current_dropzone_id -# elif dropzone.get_child(current_dropzone_id) is StickyNote: -# if currently_active_node is StickyNote: -# currently_active_node = dropzone.get_child(current_dropzone_id) -# focus_stickies = false -# current_context = ASSIGN -# current_dropzone_id += 1 -# currently_active_node.is_dragable = false -# currently_active_node.z_index = 1 get_viewport().set_input_as_handled() -# move the note it so it floats next to the card where it should be attached -func _select_card_for_assigning(sticky_note: Area2D, card: Area2D): - sticky_note.tween_transform_to(card.get_child(3).global_position) - -func on_scene_skipped(i: int): - mementos_collected += i # FIXME: sometimes -1 is passed here, why? - -func claim_focus(): - focused = true - ## Awaitable function to show the board and wait until user closes it func play() -> void: @@ -633,23 +551,10 @@ func save_to_resource(savegame: SaveGame) -> void: # Save all collected Stickies that are not on board savegame.board_stickies[child.attached_sticky_note.name] = -1 -## Legacy method for backwards compatibility -func get_save_dict() -> Dictionary: - return { - "cards": {}, - "stickies": {}, - "randoms": [] - } + func initialise_from_save(savegame: SaveGame) -> void: - # Early return if no board data - if savegame.board_cards.is_empty() and savegame.board_stickies.is_empty(): - return - - rebuild_from_save(savegame) - -func rebuild_from_save(savegame: SaveGame) -> void: # Early return if nothing to load if savegame.board_cards.is_empty() and savegame.board_stickies.is_empty(): return @@ -670,11 +575,9 @@ func rebuild_from_save(savegame: SaveGame) -> void: add_card(card, false) card.transform.origin = savegame.board_cards[card.name] cards_by_name[card.name] = card - text_recovery[card.name] = card.text card.picked_random = savegame.board_randoms.has(card.card_id) for sticky: StickyNote in card_pile["sticky_notes"]: - text_recovery[sticky.name] = sticky.text var sticky_data = savegame.board_stickies[sticky.name] if sticky_data is int: @@ -691,30 +594,6 @@ func rebuild_from_save(savegame: SaveGame) -> void: sticky.picked_random = savegame.board_randoms.has(sticky.sticky_id) -func validate_sticky(note: StickyNote) -> CardBoard.Error: - if not get_viewport_rect().has_point(note.get_global_transform().origin): - return Error.OUT_OF_BOUNDS - if note.attached_to is StickyNotePanel: - if note.position != note.attached_to.ancor_position: - return Error.OUT_OF_BOUNDS - if (note.on_board and not is_in_dropzone(note)): - return Error.ILLEGAL_STATE - if not ((note.attached_to == self and dropzone.get_children().has(note)) or note.attached_to == note.get_parent()) or note.shift_tween != null: - return Error.ILLEGAL_STATE - - return Error.OK - -func validate_card(card: Card) -> CardBoard.Error: - if not is_in_dropzone(card): - return Error.OUT_OF_BOUNDS - if card.get_attached_sticky_note() != card.current_sticky_note: - #push_error("Card %s claims to have %s as current sticky note but has %s attached." % [card.name, card.current_sticky_note, card.get_attached_sticky_note()]) - return Error.ILLEGAL_STATE - if not card.owner == self: - return Error.ILLEGAL_STATE - return CardBoard.Error.OK - - func try_select_nearest_card(from: Vector2, towards: Vector2, include_stickies: bool = false) -> bool: var selection_transform := Transform2D(0, from).looking_at(from+towards) diff --git a/src/logic-scenes/board/empty_sticky_note_panel.gd b/src/logic-scenes/board/sticky_note_panel.gd similarity index 100% rename from src/logic-scenes/board/empty_sticky_note_panel.gd rename to src/logic-scenes/board/sticky_note_panel.gd diff --git a/src/logic-scenes/board/empty_sticky_note_panel.gd.uid b/src/logic-scenes/board/sticky_note_panel.gd.uid similarity index 100% rename from src/logic-scenes/board/empty_sticky_note_panel.gd.uid rename to src/logic-scenes/board/sticky_note_panel.gd.uid diff --git a/src/logic-scenes/board/empty_sticky_note_panel.tscn b/src/logic-scenes/board/sticky_note_panel.tscn similarity index 86% rename from src/logic-scenes/board/empty_sticky_note_panel.tscn rename to src/logic-scenes/board/sticky_note_panel.tscn index 6bb438c..db946ec 100644 --- a/src/logic-scenes/board/empty_sticky_note_panel.tscn +++ b/src/logic-scenes/board/sticky_note_panel.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://chwf61qpn2sqw"] -[ext_resource type="Script" uid="uid://c8gsxyymrldcd" path="res://logic-scenes/board/empty_sticky_note_panel.gd" id="1_1dtc4"] +[ext_resource type="Script" uid="uid://c8gsxyymrldcd" path="res://logic-scenes/board/sticky_note_panel.gd" id="1_1dtc4"] [node name="Panel" type="Panel"] self_modulate = Color(1, 1, 1, 0)