class_name PlayerHand extends Node3D ## Distance cards will be apart when there is a small amount of them var card_distance_max: float = 0.18 ## Distance cards will be apart when there is a large amount of them var card_distance_min: float = 0.09 # Card distances for hands of other players var _card_distance_max_others: float = 0.03 var _card_distance_min_others: float = 0.01 var _is_owned: bool ## How many test cards to add @export var card_scene: PackedScene @export var card_container: Node3D @export_range(0, 20, 0.1, "radians_as_degrees") var card_angle: float @export var name_label: Label3D @export var hide_client_name: bool = false var _selected_card: PlayingCard = null signal card_selected(card_id: int) signal card_played(card_id: int) func _ready() -> void: if hide_client_name: name_label.hide() func add_card(card: PlayingCard) -> void: card_container.add_child(card) _arrange_cards() func add_cards(card_ids: Array[int], is_owned: bool) -> void: _is_owned = is_owned card_ids.sort() for card_id in card_ids: var card: PlayingCard = card_scene.instantiate() if is_owned: card.card_clicked.connect(_on_card_clicked) card.setup_card_details(card_id) add_card(card) await get_tree().create_timer(0.16).timeout func remove_card(card: PlayingCard) -> void: card_container.remove_child(card) card.queue_free() _arrange_cards() func _arrange_cards() -> void: var cards = card_container.get_children() # Only arrange cards if there are any! if cards.size() > 0: var card_distance: float = _get_card_distance(cards.size() - 1) var desired_width: float = (card_distance * (cards.size() - 1)) var card_position = -desired_width / 2.0 for card in cards: card.move_to(card_position) card_position += card_distance card.rotation.y = card_angle func _get_card_distance(card_count: int) -> float: if _is_owned: return card_distance_min + ((card_distance_max - card_distance_min) * (1.0 - (float(card_count) / 19.0))) else: return _card_distance_min_others + ((_card_distance_max_others - _card_distance_min_others) * (1.0 - (float(card_count) / 19.0))) func _on_card_clicked(playing_card: PlayingCard) -> void: if _selected_card: _selected_card.unselect() if _selected_card == playing_card: _selected_card = null else: _selected_card = playing_card playing_card.select() if _selected_card: card_selected.emit(_selected_card.card_details.card_id) else: card_selected.emit(-1) func _on_play_card_button_pressed() -> void: if not _selected_card: return card_played.emit(_selected_card.card_details.card_id) remove_card(_selected_card) _selected_card = null card_selected.emit(-1)