From f45817c0963b83e2192c688ae50797f95bfea59d Mon Sep 17 00:00:00 2001 From: Xanatos <10531466+XanatosX@users.noreply.github.com> Date: Sun, 21 Jun 2026 23:21:53 +0200 Subject: [PATCH 1/2] feat: add behavior to reveal corner card fix $193 --- .../game/memory_game/scenes/MemoryGame.tscn | 5 +-- .../game/memory_game/scripts/GameCardGrid.gd | 8 +++++ .../behaviors/RevealUnknownCornerCard.gd | 35 +++++++++++++++++++ .../behaviors/RevealUnknownCornerCard.gd.uid | 1 + 4 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 shared/entities/ai_behavior/resources/behaviors/RevealUnknownCornerCard.gd create mode 100644 shared/entities/ai_behavior/resources/behaviors/RevealUnknownCornerCard.gd.uid diff --git a/entities/game/memory_game/scenes/MemoryGame.tscn b/entities/game/memory_game/scenes/MemoryGame.tscn index 79e408b4..f5fb5ca7 100644 --- a/entities/game/memory_game/scenes/MemoryGame.tscn +++ b/entities/game/memory_game/scenes/MemoryGame.tscn @@ -264,10 +264,7 @@ player_node = NodePath("../Manager/Players") [connection signal="card_placed" from="Cards/CardSpawner" to="." method="card_was_placed"] [connection signal="card_placed" from="Cards/CardSpawner" to="Cards" method="card_was_placed"] [connection signal="card_placing_done" from="Cards/CardSpawner" to="Manager/GameStateMachine" method="game_field_ready"] -[connection signal="request_state_change" from="Cards/CardSpawner" to="Manager/GameStateMachine" method="change_state"] -[connection signal="deck_changed" from="CardTemplateGhost" to="CardTemplateGhost/CanvasGroup/DropShadow" method="deck_changed"] -[connection signal="deck_changed" from="CardTemplateGhost" to="CardTemplateGhost/CardBack" method="deck_changed"] -[connection signal="input_active" from="CardTemplateGhost" to="CardTemplateGhost/CardBack" method="input_active"] +[connection signal="field_constructed" from="Cards/CardSpawner" to="Cards" method="receive_field_size"] [connection signal="card_was_clicked" from="NetworkHandler" to="Cards" method="trigger_card_at_position"] [connection signal="game_has_been_finished" from="NetworkHandler" to="CanvasLayer/PlayersOverlay" method="game_ended"] [connection signal="game_state_has_changed" from="NetworkHandler" to="Manager/PlayerInput" method="game_state_changed"] diff --git a/entities/game/memory_game/scripts/GameCardGrid.gd b/entities/game/memory_game/scripts/GameCardGrid.gd index 5f4170ef..a8ddf088 100644 --- a/entities/game/memory_game/scripts/GameCardGrid.gd +++ b/entities/game/memory_game/scripts/GameCardGrid.gd @@ -18,6 +18,8 @@ var currently_ai_player: bool = false var number_of_triggered_cards: int = 0 +var _field_size: Vector2i = Vector2i.ZERO + enum Axis {X, Y} func get_current_grid_position() -> Point: @@ -25,6 +27,12 @@ func get_current_grid_position() -> Point: return Point.new(0,0) return Point.new(current_card.grid_position.get_x_pos(), current_card.grid_position.get_y_pos()) +func receive_field_size(x: int, y: int) -> void: + _field_size = Vector2i(x - 1, y - 1) # Field size starts at 1 but index starts at 0 + +func get_field_size() -> Vector2i: + return _field_size + func _move_axis(direction: int, axis: Axis) -> void: var clamped_direction: int = clampi(direction, -1, 1) if clamped_direction == 0: diff --git a/shared/entities/ai_behavior/resources/behaviors/RevealUnknownCornerCard.gd b/shared/entities/ai_behavior/resources/behaviors/RevealUnknownCornerCard.gd new file mode 100644 index 00000000..bb94b902 --- /dev/null +++ b/shared/entities/ai_behavior/resources/behaviors/RevealUnknownCornerCard.gd @@ -0,0 +1,35 @@ +class_name RevealUnknownCornerCard extends AiBehaviorNode + +func can_execute(blackboard: Blackboard, grid: GameCardGrid) -> bool: + for position: Point in grid.get_all_card_positions(false): + var real_position: Vector2i = Vector2i(position.get_x_pos(), position.get_y_pos()) + if _get_corner_positions(grid).find(real_position) != -1 and not _blackboard_card_known(blackboard, position): + return true + return false + +func _blackboard_card_known(blackboard: Blackboard, position: Point) -> bool: + for card: CardInformationResource in blackboard.get_all_saved_cards(): + if card.position.is_identical(position): + return true + return false + +func _get_corner_positions(grid: GameCardGrid) -> Array[Vector2i]: + var field_size: Vector2i = grid.get_field_size() + var allowed_positions: Array[Vector2i] = [ + Vector2i.ZERO, # top left + Vector2i(field_size.x, 0), # top right + Vector2i(0, field_size.y), # bottom left + Vector2i(field_size.x, field_size.y) # bottom right + ] + return allowed_positions + +func execute_action(blackboard: Blackboard, grid: GameCardGrid) -> void: + var allowed_positions: Array[Vector2i] = _get_corner_positions(grid) + var valid_positions: Array[Vector2i] = [] + for position: Vector2i in allowed_positions: + if not _blackboard_card_known(blackboard, Point.new(position.x, position.y)): + valid_positions.append(position) + + var position: Vector2i = valid_positions.pick_random() + var point: Point = Point.new(position.x, position.y) + _trigger_card(point, blackboard, grid) \ No newline at end of file diff --git a/shared/entities/ai_behavior/resources/behaviors/RevealUnknownCornerCard.gd.uid b/shared/entities/ai_behavior/resources/behaviors/RevealUnknownCornerCard.gd.uid new file mode 100644 index 00000000..6c4e10a8 --- /dev/null +++ b/shared/entities/ai_behavior/resources/behaviors/RevealUnknownCornerCard.gd.uid @@ -0,0 +1 @@ +uid://cpatt50glnh1y From af69d798d1184da66281334592c04be6570f9893 Mon Sep 17 00:00:00 2001 From: Xanatos <10531466+XanatosX@users.noreply.github.com> Date: Sun, 21 Jun 2026 23:22:53 +0200 Subject: [PATCH 2/2] fix: remove unused collect card template method The method added here was not necessary as there is already a method doing the exact same, therefor it was removed. --- .../game/memory_game/scripts/GameCardGrid.gd | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/entities/game/memory_game/scripts/GameCardGrid.gd b/entities/game/memory_game/scripts/GameCardGrid.gd index a8ddf088..b1c12597 100644 --- a/entities/game/memory_game/scripts/GameCardGrid.gd +++ b/entities/game/memory_game/scripts/GameCardGrid.gd @@ -137,7 +137,7 @@ func trigger_card_at_position(grid_position: Point) -> void: func remove_cards_from_board(grid_positions: Array[Point]) -> void: for grid_position: Point in grid_positions: remove_card_from_board(grid_position) - for card: CardTemplate in _get_all_cards(): + for card: CardTemplate in _get_game_card_templates(): if card.is_playing_animation(): await card.about_to_get_delete all_matching_cards_removed.emit() @@ -211,7 +211,7 @@ func card_loading_done() -> void: card.mouse_was_used.connect(func() -> void: current_card = null Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) - ) + ) func game_state_changed(game_state: GameEnum.State) -> void: match game_state: @@ -219,8 +219,8 @@ func game_state_changed(game_state: GameEnum.State) -> void: round_unfrozen() for card: CardTemplate in _get_game_card_templates(): card.player_changed(currently_ai_player) - print(_get_all_cards().size()) - if _get_all_cards().size() == 0: + print(_get_game_card_templates().size()) + if _get_game_card_templates().size() == 0: board_empty.emit() GameEnum.State.TURN_FREEZE: @@ -231,7 +231,7 @@ func game_state_changed(game_state: GameEnum.State) -> void: _prepare_turn_complete() func _validate_grid() -> void: - for card: CardTemplate in _get_all_cards(): + for card: CardTemplate in _get_game_card_templates(): if card == null or card.is_queued_for_deletion(): continue if card.is_turned() and not card.card_is_fully_shown(): @@ -239,12 +239,12 @@ func _validate_grid() -> void: await card.fully_shown if _any_matching(): var card_positions: Array[Point] = [] - for card: CardTemplate in _get_all_cards(): + for card: CardTemplate in _get_game_card_templates(): if card.is_turned(): card_positions.append(card.grid_position) identical_cards.emit(card_positions[0], card_positions[1]) remove_cards_from_board(card_positions) - var count: int = _get_all_cards().filter(func (card: CardTemplate) -> bool: return not card.getting_removed).size() + var count: int = _get_game_card_templates().filter(func (card: CardTemplate) -> bool: return not card.getting_removed).size() if count == 0: board_empty.emit() @@ -254,7 +254,7 @@ func _validate_grid() -> void: no_matches_found.emit() func _prepare_turn_complete() -> void: - for card: CardTemplate in _get_all_cards(): + for card: CardTemplate in _get_game_card_templates(): if card == null or card.is_queued_for_deletion(): continue if not card.card_is_hidden(): @@ -262,7 +262,7 @@ func _prepare_turn_complete() -> void: await card.fully_hidden print ("continue prepare turn complete") - var all_cards: Array[CardTemplate] = _get_all_cards() + var all_cards: Array[CardTemplate] = _get_game_card_templates() if all_cards.size() == 0: board_empty.emit() return @@ -271,7 +271,7 @@ func _prepare_turn_complete() -> void: func _any_matching() -> bool: var first_found: CardTemplate = null - for card: CardTemplate in _get_all_cards(): + for card: CardTemplate in _get_game_card_templates(): if not card.is_turned(): continue if first_found == null: @@ -281,13 +281,6 @@ func _any_matching() -> bool: return true return false -func _get_all_cards() -> Array[CardTemplate]: - var _templates: Array[CardTemplate] = [] - for card_node: Node in get_children(): - if card_node is CardTemplate: - _templates.append(card_node) - return _templates - func get_all_card_positions(get_turned: bool = false) -> Array[Point]: var return_data: Array[Point] = [] for card: CardTemplate in _get_game_card_templates_children():