This repository has been archived on 2026-05-26. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
magician/elements/player_hand.gd
T

103 lines
2.9 KiB
GDScript
Raw Normal View History

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
2025-07-16 09:35:32 +02:00
# 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
2025-07-16 09:35:32 +02:00
@export var card_container: Node3D
@export_range(0, 20, 0.1, "radians_as_degrees") var card_angle: float
2025-07-16 09:35:32 +02:00
@export var name_label: Label3D
@export var rank_label: Label3D
2025-07-16 09:35:32 +02:00
@export var hide_client_name: bool = false
2025-07-08 16:48:41 +02:00
var _selected_card: PlayingCard = null
signal card_selected(card_id: int)
signal card_played(card_id: int)
2025-07-16 09:35:32 +02:00
func _ready() -> void:
if hide_client_name:
name_label.hide()
func set_player_name(player_name: String) -> void:
name_label.text = player_name
func add_card(card: PlayingCard) -> void:
2025-07-16 09:35:32 +02:00
card_container.add_child(card)
_arrange_cards()
2025-07-16 09:35:32 +02:00
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()
2025-07-16 09:35:32 +02:00
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:
2025-07-16 09:35:32 +02:00
card_container.remove_child(card)
card.queue_free()
_arrange_cards()
func _arrange_cards() -> void:
2025-07-16 09:35:32 +02:00
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:
2025-07-16 09:35:32 +02:00
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:
2025-07-08 16:48:41 +02:00
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)
func display_rank(rank: int, score: int) -> void:
rank_label.text = "#{rank} ({pts} pts)".format({
"rank": rank,
"pts": score,
})