Files
jass-learner/addons/card-framework/card.gd
Aspergerli ade3d0fb01 init
2026-03-09 19:18:47 +01:00

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()