added card attachment Ui and card removal
This commit is contained in:
parent
61e4cd88ba
commit
a9f79d673c
8 changed files with 123 additions and 16 deletions
|
|
@ -43,6 +43,8 @@ func drawCard():
|
||||||
if !deck.is_empty() && hand.size() < hand_size:
|
if !deck.is_empty() && hand.size() < hand_size:
|
||||||
hand.append(deck.pop_back())
|
hand.append(deck.pop_back())
|
||||||
|
|
||||||
|
emit_signal("hand_updated", hand)
|
||||||
|
|
||||||
|
|
||||||
signal hand_updated
|
signal hand_updated
|
||||||
|
|
||||||
|
|
@ -51,8 +53,12 @@ signal hand_updated
|
||||||
func playCard(card: Card, target_piece: Pawn, board_flow = null, game_state = null):
|
func playCard(card: Card, target_piece: Pawn, board_flow = null, game_state = null):
|
||||||
if !hand.has(card):
|
if !hand.has(card):
|
||||||
return false
|
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.apply_effect(target_piece, board_flow, game_state):
|
||||||
|
if card.duration > 0:
|
||||||
|
attached_cards[target_piece.get_instance_id()] = card
|
||||||
hand.erase(card)
|
hand.erase(card)
|
||||||
emit_signal("hand_updated", hand)
|
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)
|
deck.append(card)
|
||||||
shuffleDeck()
|
shuffleDeck()
|
||||||
|
|
||||||
if card.duration > 0:
|
|
||||||
attached_cards[target_piece.get_instance_id()] = card
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
return false
|
return false
|
||||||
|
|
@ -80,11 +84,20 @@ func updateCardDurations():
|
||||||
for piece_id in attached_cards:
|
for piece_id in attached_cards:
|
||||||
var card = attached_cards[piece_id]
|
var card = attached_cards[piece_id]
|
||||||
card.update_duration()
|
card.update_duration()
|
||||||
|
print("Card: ", card.id, " | ", card.card_name, " | ", card.remaining_turns)
|
||||||
if card.remaining_turns <= 0:
|
if card.remaining_turns <= 0:
|
||||||
expired_cards.append(piece_id)
|
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:
|
for piece_id in expired_cards:
|
||||||
attached_cards.erase(piece_id)
|
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
|
# Shop functionality
|
||||||
func getShopCards(num_cards: int = 3) -> Array:
|
func getShopCards(num_cards: int = 3) -> Array:
|
||||||
|
|
|
||||||
|
|
@ -362,10 +362,11 @@ func resolveMoveEffects() -> void:
|
||||||
Turn = 1 if Turn == 0 else 0
|
Turn = 1 if Turn == 0 else 0
|
||||||
updateTurnIndicator()
|
updateTurnIndicator()
|
||||||
resetHighlights()
|
resetHighlights()
|
||||||
deckManager.updateCardDurations()
|
|
||||||
hasMoved = false
|
hasMoved = false
|
||||||
currentlyMovingPiece = null
|
currentlyMovingPiece = null
|
||||||
|
|
||||||
|
func isPlayerTurn() -> bool:
|
||||||
|
return currentPlayer == WHITE
|
||||||
|
|
||||||
func resetHighlights():
|
func resetHighlights():
|
||||||
for button in boardContainer.get_children():
|
for button in boardContainer.get_children():
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ func enter(_previous: String, _data := {}) -> void:
|
||||||
game.boardContainer.connect("tile_pressed", handleTilePressed)
|
game.boardContainer.connect("tile_pressed", handleTilePressed)
|
||||||
|
|
||||||
timer.start(ATTACHMENT_PHASE_DURATION)
|
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()
|
complete_attachment_phase()
|
||||||
|
|
||||||
func exit() -> void:
|
func exit() -> void:
|
||||||
|
|
@ -46,7 +46,8 @@ func handleTilePressed(location: String) -> void:
|
||||||
if isCorrectColor and selectedCard.can_attach_to_piece(piece) and \
|
if isCorrectColor and selectedCard.can_attach_to_piece(piece) and \
|
||||||
!game.deckManager.attached_cards.has(piece.get_instance_id()):
|
!game.deckManager.attached_cards.has(piece.get_instance_id()):
|
||||||
if game.deckManager.playCard(selectedCard, piece, game.boardContainer, game):
|
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():
|
if game.deckManager.hand.is_empty():
|
||||||
complete_attachment_phase()
|
complete_attachment_phase()
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@ extends "res://Systems/StateMachine/ChessGameState.gd"
|
||||||
|
|
||||||
func enter(_previous: String, _data := {}) -> void:
|
func enter(_previous: String, _data := {}) -> void:
|
||||||
print("ENTERING STATE ", Constants.DRAW_PHASE)
|
print("ENTERING STATE ", Constants.DRAW_PHASE)
|
||||||
# deckManager.drawCards()
|
if (game.isPlayerTurn()):
|
||||||
|
game.deckManager.drawCard()
|
||||||
finished.emit(Constants.PERSISTENT_EFFECTS)
|
finished.emit(Constants.PERSISTENT_EFFECTS)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,9 +1,41 @@
|
||||||
extends "res://Systems/StateMachine/ChessGameState.gd"
|
extends "res://Systems/StateMachine/ChessGameState.gd"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func enter(_previous: String, _data := {}) -> void:
|
func enter(_previous: String, _data := {}) -> void:
|
||||||
print("ENTERING STATE ", Constants.HAND_SETUP)
|
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)
|
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:
|
# func prepareHand() -> void:
|
||||||
# if deckManager.hand.size() < 5:
|
# if deckManager.hand.size() < 5:
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ func exit() -> void:
|
||||||
game.boardContainer.disconnect("tile_pressed", handleMovement)
|
game.boardContainer.disconnect("tile_pressed", handleMovement)
|
||||||
|
|
||||||
func handleMovement(location: String) -> void:
|
func handleMovement(location: String) -> void:
|
||||||
print("HANDLING MOVEMENT ", location)
|
# print("HANDLING MOVEMENT ", location)
|
||||||
var node = game.get_node("Flow/" + location)
|
var node = game.get_node("Flow/" + location)
|
||||||
if game.selectedNode == "":
|
if game.selectedNode == "":
|
||||||
if node.get_child_count() != 0 && node.get_child(0).Item_Color == game.Turn:
|
if node.get_child_count() != 0 && node.get_child(0).Item_Color == game.Turn:
|
||||||
|
|
|
||||||
|
|
@ -3,4 +3,7 @@ extends "res://Systems/StateMachine/ChessGameState.gd"
|
||||||
func enter(_previous: String, _data := {}) -> void:
|
func enter(_previous: String, _data := {}) -> void:
|
||||||
print("ENTERING STATE ", Constants.POST_MOVE)
|
print("ENTERING STATE ", Constants.POST_MOVE)
|
||||||
# game.resolveMoveEffects()
|
# game.resolveMoveEffects()
|
||||||
|
|
||||||
|
if (game.isPlayerTurn()):
|
||||||
|
game.deckManager.updateCardDurations()
|
||||||
finished.emit(Constants.EVALUATE_POSITION)
|
finished.emit(Constants.EVALUATE_POSITION)
|
||||||
|
|
|
||||||
|
|
@ -11,22 +11,78 @@ class_name Pawn
|
||||||
|
|
||||||
@export var Points = 1
|
@export var Points = 1
|
||||||
|
|
||||||
|
var attached_card_label: Label
|
||||||
|
var duration_label: Label
|
||||||
var Temp_Color = 0
|
var Temp_Color = 0
|
||||||
var Double_Start = true
|
var Double_Start = true
|
||||||
var En_Passant = false
|
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():
|
func _ready():
|
||||||
|
modulate = Color.WHITE if Item_Color == 0 else Color.BLACK
|
||||||
|
|
||||||
|
func _init() -> void:
|
||||||
self.texture = load("res://addons/Chess/Textures/WPawn.svg")
|
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):
|
# func _process(_delta):
|
||||||
if Item_Color != Temp_Color:
|
# if Item_Color != Temp_Color:
|
||||||
Temp_Color = Item_Color
|
# Temp_Color = Item_Color
|
||||||
if Item_Color == 0:
|
# if Item_Color == 0:
|
||||||
self.texture = load("res://addons/Chess/Textures/WPawn.svg")
|
# self.texture = load("res://addons/Chess/Textures/WPawn.svg")
|
||||||
elif Item_Color == 1:
|
# elif Item_Color == 1:
|
||||||
self.texture = load("res://addons/Chess/Textures/BPawn.svg")
|
# 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
|
# Movement interface method that all pieces will implement
|
||||||
# In Pawn.gd
|
# In Pawn.gd
|
||||||
func getValidMoves(board_flow, current_location: String) -> Dictionary:
|
func getValidMoves(board_flow, current_location: String) -> Dictionary:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue