From a9f79d673c31373825858a783adefa8f5dbdd66c Mon Sep 17 00:00:00 2001 From: 2ManyProjects Date: Thu, 30 Jan 2025 18:48:24 -0600 Subject: [PATCH] added card attachment Ui and card removal --- Systems/DeckManager.gd | 19 ++++- Systems/Game/ChessGame.gd | 3 +- .../StateMachine/GameStates/AttachCards.gd | 5 +- Systems/StateMachine/GameStates/DrawPhase.gd | 3 +- Systems/StateMachine/GameStates/HandSetup.gd | 34 ++++++++- Systems/StateMachine/GameStates/Movement.gd | 2 +- .../StateMachine/GameStates/PostMovePhase.gd | 3 + addons/Chess/Scripts/Pawn.gd | 70 +++++++++++++++++-- 8 files changed, 123 insertions(+), 16 deletions(-) diff --git a/Systems/DeckManager.gd b/Systems/DeckManager.gd index c223306..9eddfe4 100644 --- a/Systems/DeckManager.gd +++ b/Systems/DeckManager.gd @@ -42,6 +42,8 @@ func drawCard(): if !deck.is_empty() && hand.size() < hand_size: hand.append(deck.pop_back()) + + emit_signal("hand_updated", hand) signal hand_updated @@ -51,8 +53,12 @@ signal hand_updated func playCard(card: Card, target_piece: Pawn, board_flow = null, game_state = null): if !hand.has(card): return false + if card.duration > 0: + attached_cards[target_piece.get_instance_id()] = card if card.apply_effect(target_piece, board_flow, game_state): + if card.duration > 0: + attached_cards[target_piece.get_instance_id()] = card hand.erase(card) emit_signal("hand_updated", hand) @@ -69,8 +75,6 @@ func playCard(card: Card, target_piece: Pawn, board_flow = null, game_state = nu deck.append(card) shuffleDeck() - if card.duration > 0: - attached_cards[target_piece.get_instance_id()] = card return true return false @@ -80,11 +84,20 @@ func updateCardDurations(): for piece_id in attached_cards: var card = attached_cards[piece_id] card.update_duration() + print("Card: ", card.id, " | ", card.card_name, " | ", card.remaining_turns) if card.remaining_turns <= 0: expired_cards.append(piece_id) - + else: + var piece_node = instance_from_id(piece_id) + if is_instance_valid(piece_node): + piece_node.update_appearance() for piece_id in expired_cards: attached_cards.erase(piece_id) + var piece_node = instance_from_id(piece_id) + if is_instance_valid(piece_node): + piece_node.update_appearance() + + # print("updateCardDurations", attached_cards) # Shop functionality func getShopCards(num_cards: int = 3) -> Array: diff --git a/Systems/Game/ChessGame.gd b/Systems/Game/ChessGame.gd index 5cd8119..07c9d09 100644 --- a/Systems/Game/ChessGame.gd +++ b/Systems/Game/ChessGame.gd @@ -362,10 +362,11 @@ func resolveMoveEffects() -> void: Turn = 1 if Turn == 0 else 0 updateTurnIndicator() resetHighlights() - deckManager.updateCardDurations() hasMoved = false currentlyMovingPiece = null +func isPlayerTurn() -> bool: + return currentPlayer == WHITE func resetHighlights(): for button in boardContainer.get_children(): diff --git a/Systems/StateMachine/GameStates/AttachCards.gd b/Systems/StateMachine/GameStates/AttachCards.gd index f33bfdf..cf11e3e 100644 --- a/Systems/StateMachine/GameStates/AttachCards.gd +++ b/Systems/StateMachine/GameStates/AttachCards.gd @@ -17,7 +17,7 @@ func enter(_previous: String, _data := {}) -> void: game.boardContainer.connect("tile_pressed", handleTilePressed) timer.start(ATTACHMENT_PHASE_DURATION) - if game.deckManager.hand.is_empty(): + if game.deckManager.hand.is_empty() or (game.currentPlayer == game.BLACK): complete_attachment_phase() func exit() -> void: @@ -46,7 +46,8 @@ func handleTilePressed(location: String) -> void: if isCorrectColor and selectedCard.can_attach_to_piece(piece) and \ !game.deckManager.attached_cards.has(piece.get_instance_id()): if game.deckManager.playCard(selectedCard, piece, game.boardContainer, game): - print("Successfully attached card ", selectedCard.card_name, " to ", piece.name) + print("Successfully attached card ", selectedCard.card_name, " to ", piece.name, " at ", location) + piece.on_card_effect_changed() if game.deckManager.hand.is_empty(): complete_attachment_phase() else: diff --git a/Systems/StateMachine/GameStates/DrawPhase.gd b/Systems/StateMachine/GameStates/DrawPhase.gd index 04337bd..3d69f13 100644 --- a/Systems/StateMachine/GameStates/DrawPhase.gd +++ b/Systems/StateMachine/GameStates/DrawPhase.gd @@ -2,7 +2,8 @@ extends "res://Systems/StateMachine/ChessGameState.gd" func enter(_previous: String, _data := {}) -> void: print("ENTERING STATE ", Constants.DRAW_PHASE) - # deckManager.drawCards() + if (game.isPlayerTurn()): + game.deckManager.drawCard() finished.emit(Constants.PERSISTENT_EFFECTS) \ No newline at end of file diff --git a/Systems/StateMachine/GameStates/HandSetup.gd b/Systems/StateMachine/GameStates/HandSetup.gd index b53f575..7154cfa 100644 --- a/Systems/StateMachine/GameStates/HandSetup.gd +++ b/Systems/StateMachine/GameStates/HandSetup.gd @@ -1,9 +1,41 @@ extends "res://Systems/StateMachine/ChessGameState.gd" + + func enter(_previous: String, _data := {}) -> void: print("ENTERING STATE ", Constants.HAND_SETUP) - # prepareHand() + + if (game.currentPlayer == game.BLACK): + finished.emit(Constants.DRAW_PHASE) + return + # game.deckManager.updateCardDurations(); finished.emit(Constants.DRAW_PHASE) + # Go through all attached cards and update their durations + # var expired_cards = [] + + # for piece_id in game.deckManager.attached_cards: + # var card = game.deckManager.attached_cards[piece_id] + # card.remaining_turns -= 1 + # print("Card DUration ", card.remaining_turns); + + # # If card duration is expired, add to removal list + # if card.remaining_turns <= 0: + # expired_cards.append(piece_id) + + # # Update the piece's visual appearance to show new duration + # var piece_node = instance_from_id(piece_id) + # if is_instance_valid(piece_node): + # piece_node.update_appearance() + + # # Remove all expired cards + # for piece_id in expired_cards: + # var piece_node = instance_from_id(piece_id) + # if is_instance_valid(piece_node): + # piece_node.update_appearance() # Update appearance one final time + # game.deckManager.attached_cards.erase(piece_id) + + # Move to draw phase + # finished.emit(Constants.DRAW_PHASE) # func prepareHand() -> void: # if deckManager.hand.size() < 5: diff --git a/Systems/StateMachine/GameStates/Movement.gd b/Systems/StateMachine/GameStates/Movement.gd index 386f4e9..c844940 100644 --- a/Systems/StateMachine/GameStates/Movement.gd +++ b/Systems/StateMachine/GameStates/Movement.gd @@ -18,7 +18,7 @@ func exit() -> void: game.boardContainer.disconnect("tile_pressed", handleMovement) func handleMovement(location: String) -> void: - print("HANDLING MOVEMENT ", location) + # print("HANDLING MOVEMENT ", location) var node = game.get_node("Flow/" + location) if game.selectedNode == "": if node.get_child_count() != 0 && node.get_child(0).Item_Color == game.Turn: diff --git a/Systems/StateMachine/GameStates/PostMovePhase.gd b/Systems/StateMachine/GameStates/PostMovePhase.gd index c5252a8..91b6471 100644 --- a/Systems/StateMachine/GameStates/PostMovePhase.gd +++ b/Systems/StateMachine/GameStates/PostMovePhase.gd @@ -3,4 +3,7 @@ extends "res://Systems/StateMachine/ChessGameState.gd" func enter(_previous: String, _data := {}) -> void: print("ENTERING STATE ", Constants.POST_MOVE) # game.resolveMoveEffects() + + if (game.isPlayerTurn()): + game.deckManager.updateCardDurations() finished.emit(Constants.EVALUATE_POSITION) diff --git a/addons/Chess/Scripts/Pawn.gd b/addons/Chess/Scripts/Pawn.gd index 8932767..a611544 100644 --- a/addons/Chess/Scripts/Pawn.gd +++ b/addons/Chess/Scripts/Pawn.gd @@ -11,22 +11,78 @@ class_name Pawn @export var Points = 1 +var attached_card_label: Label +var duration_label: Label var Temp_Color = 0 var Double_Start = true var En_Passant = false +const BASE_SIZE = Vector2(40, 40) +const EFFECT_TINT_COLOR = Color(0.3, 0.8, 0.3, 0.5) # Green tint for card effects func _ready(): + modulate = Color.WHITE if Item_Color == 0 else Color.BLACK + +func _init() -> void: self.texture = load("res://addons/Chess/Textures/WPawn.svg") + var background_style = StyleBoxFlat.new() + background_style.bg_color = Color.WHITE + background_style.corner_radius_top_left = 2 + background_style.corner_radius_top_right = 2 + background_style.corner_radius_bottom_left = 2 + background_style.corner_radius_bottom_right = 2 + background_style.content_margin_left = 2 + background_style.content_margin_right = 2 + background_style.content_margin_top = 1 + background_style.content_margin_bottom = 1 + duration_label = Label.new() + duration_label.add_theme_stylebox_override("normal", background_style) + duration_label.add_theme_color_override("font_color", Color.BLACK) + duration_label.position = Vector2(-20, -20) # Position above the piece + add_child(duration_label) + duration_label.hide() -func _process(_delta): - if Item_Color != Temp_Color: - Temp_Color = Item_Color - if Item_Color == 0: - self.texture = load("res://addons/Chess/Textures/WPawn.svg") - elif Item_Color == 1: - self.texture = load("res://addons/Chess/Textures/BPawn.svg") +# func _process(_delta): +# if Item_Color != Temp_Color: +# Temp_Color = Item_Color +# if Item_Color == 0: +# self.texture = load("res://addons/Chess/Textures/WPawn.svg") +# elif Item_Color == 1: +# self.texture = load("res://addons/Chess/Textures/BPawn.svg") +func update_appearance() -> void: + print("update_appearance") + if !is_instance_valid(get_tree()) || !get_tree().get_root().has_node("Board"): + return + + var chess_game = get_tree().get_root().get_node("Board") + if !chess_game.deckManager: + return + + var deck_manager = chess_game.deckManager + var has_card = deck_manager.attached_cards.has(get_instance_id()) + + if has_card: + # Apply tint while keeping the piece color + var base_color = Color.WHITE if Item_Color == 0 else Color.BLACK + modulate = base_color * EFFECT_TINT_COLOR + + # Update duration display + var card = deck_manager.attached_cards[get_instance_id()] + if is_instance_valid(duration_label): + duration_label.text = str(card.remaining_turns) + duration_label.show() + else: + # Reset to normal color + modulate = Color.WHITE if Item_Color == 0 else Color.BLACK + if is_instance_valid(duration_label): + duration_label.hide() + + + + +func on_card_effect_changed() -> void: + update_appearance() # Movement interface method that all pieces will implement # In Pawn.gd func getValidMoves(board_flow, current_location: String) -> Dictionary: