136 lines
4.0 KiB
GDScript
136 lines
4.0 KiB
GDScript
## A card object that represents a single playing card with drag-and-drop functionality.
|
|
##
|
|
## The Card class extends DraggableObject to provide interactive card behavior including
|
|
## hover effects, drag operations, and visual state management. Cards can display
|
|
## different faces (front/back) and integrate with the card framework's container system.
|
|
##
|
|
## Key Features:
|
|
## - Visual state management (front/back face display)
|
|
## - Drag-and-drop interaction with state machine
|
|
## - Integration with CardContainer for organized card management
|
|
## - Hover animation and visual feedback
|
|
##
|
|
## Usage:
|
|
## [codeblock]
|
|
## var card = card_factory.create_card("ace_spades", target_container)
|
|
## card.show_front = true
|
|
## card.move(target_position, 0)
|
|
## [/codeblock]
|
|
class_name Card
|
|
extends DraggableObject
|
|
|
|
# Static counters for global card state tracking
|
|
static var hovering_card_count: int = 0
|
|
static var holding_card_count: int = 0
|
|
|
|
|
|
## The name of the card.
|
|
@export var card_name: String
|
|
## The size of the card.
|
|
@export var card_size: Vector2 = CardFrameworkSettings.LAYOUT_DEFAULT_CARD_SIZE
|
|
## The texture for the front face of the card.
|
|
@export var front_image: Texture2D
|
|
## The texture for the back face of the card.
|
|
@export var back_image: Texture2D
|
|
## Whether the front face of the card is shown.
|
|
## If true, the front face is visible; otherwise, the back face is visible.
|
|
@export var show_front: bool = true:
|
|
set(value):
|
|
if value:
|
|
front_face_texture.visible = true
|
|
back_face_texture.visible = false
|
|
else:
|
|
front_face_texture.visible = false
|
|
back_face_texture.visible = true
|
|
|
|
|
|
# Card data and container reference
|
|
var card_info: Dictionary
|
|
var card_container: CardContainer
|
|
|
|
|
|
@onready var front_face_texture: TextureRect = $FrontFace/TextureRect
|
|
@onready var back_face_texture: TextureRect = $BackFace/TextureRect
|
|
|
|
|
|
func _ready() -> void:
|
|
super._ready()
|
|
front_face_texture.size = card_size
|
|
back_face_texture.size = card_size
|
|
if front_image:
|
|
front_face_texture.texture = front_image
|
|
if back_image:
|
|
back_face_texture.texture = back_image
|
|
pivot_offset = card_size / 2
|
|
|
|
|
|
func _on_move_done() -> void:
|
|
card_container.on_card_move_done(self)
|
|
|
|
|
|
## Sets the front and back face textures for this card.
|
|
##
|
|
## @param front_face: The texture to use for the front face
|
|
## @param back_face: The texture to use for the back face
|
|
func set_faces(front_face: Texture2D, back_face: Texture2D) -> void:
|
|
front_face_texture.texture = front_face
|
|
back_face_texture.texture = back_face
|
|
|
|
|
|
## Returns the card to its original position with smooth animation.
|
|
func return_card() -> void:
|
|
super.return_to_original()
|
|
|
|
|
|
# Override state entry to add card-specific logic
|
|
func _enter_state(state: DraggableState, from_state: DraggableState) -> void:
|
|
super._enter_state(state, from_state)
|
|
|
|
match state:
|
|
DraggableState.HOVERING:
|
|
hovering_card_count += 1
|
|
DraggableState.HOLDING:
|
|
holding_card_count += 1
|
|
if card_container:
|
|
card_container.hold_card(self)
|
|
|
|
# Override state exit to add card-specific logic
|
|
func _exit_state(state: DraggableState) -> void:
|
|
match state:
|
|
DraggableState.HOVERING:
|
|
hovering_card_count -= 1
|
|
DraggableState.HOLDING:
|
|
holding_card_count -= 1
|
|
|
|
super._exit_state(state)
|
|
|
|
## Legacy compatibility method for holding state.
|
|
## @deprecated Use state machine transitions instead
|
|
func set_holding() -> void:
|
|
if card_container:
|
|
card_container.hold_card(self)
|
|
|
|
|
|
## Returns a string representation of this card.
|
|
func get_string() -> String:
|
|
return card_name
|
|
|
|
|
|
## Checks if this card can start hovering based on global card state.
|
|
## Prevents multiple cards from hovering simultaneously.
|
|
func _can_start_hovering() -> bool:
|
|
return hovering_card_count == 0 and holding_card_count == 0
|
|
|
|
|
|
## Handles mouse press events with container notification.
|
|
func _handle_mouse_pressed() -> void:
|
|
card_container.on_card_pressed(self)
|
|
super._handle_mouse_pressed()
|
|
|
|
|
|
## Handles mouse release events and releases held cards.
|
|
func _handle_mouse_released() -> void:
|
|
super._handle_mouse_released()
|
|
if card_container:
|
|
card_container.release_holding_cards()
|