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/cards/card_manager.gd
T

139 lines
3.7 KiB
GDScript

extends Node
@export var full_deck: Dictionary[int, Card]
@export var card_fallback_texture: Texture
enum CardStyle {
STICKMAN,
}
func get_shuffled_cards(client_ids: Array[String], cards_to_pick: int) -> Dictionary: # Dictionary[String, Array[int]]
var dict: Dictionary = {}
var deck: Array[int] = full_deck.keys()
deck.shuffle()
var card_index = 0
for client_id in client_ids:
var player_deck: Array[int] = []
for j in cards_to_pick:
player_deck.append(deck[card_index])
card_index += 1
dict[client_id] = player_deck
# Add trump card, if there are cards left in the deck
if card_index == 60:
dict["trump"] = -1
else:
dict["trump"] = deck[card_index]
return dict
func get_card_texture(card_id: int, style: CardStyle = CardStyle.STICKMAN) -> Texture:
var style_name: String = ""
match style:
CardStyle.STICKMAN:
style_name = "stickman"
return load("res://cards/textures/" + style_name + "/" + _get_card_name(card_id) + ".webp")
func get_winning_card(card_ids: Array[int], trump: int) -> int:
if card_ids.has(56) or card_ids.has(57) or card_ids.has(58) or card_ids.has(59):
# cards contain magician
for card_id in card_ids:
if full_deck[card_id].card_type == Card.CardType.MAGICIAN:
return card_id
return -1 # should not happen
elif not trump == -1:
# trump exists, determine winner from this
var largest_trump_card_id: int = -1
var trump_color: Card.CardColor = full_deck[trump].color
for card_id in card_ids:
if full_deck[card_id].color == trump_color and card_id > largest_trump_card_id:
largest_trump_card_id = card_id
if not largest_trump_card_id == -1:
return largest_trump_card_id
# no trump played; determine from highest played card
return _get_largest_non_trump_card(card_ids)
else:
# no trump exists
return _get_largest_non_trump_card(card_ids)
func _get_largest_non_trump_card(card_ids: Array[int]) -> int:
var largest_card_id: int = -1
var first_color: Card.CardColor = _get_first_color_card(card_ids)
if first_color == Card.CardColor.WHITE:
return card_ids[0] # first one wins if all played cards are white
else:
for card_id in card_ids:
if full_deck[card_id].color == first_color and card_id > largest_card_id:
largest_card_id = card_id
return largest_card_id
## Returns the color of the first non-white card played.
## Returns WHITE if all cards played are white.
func _get_first_color_card(card_ids: Array[int]) -> Card.CardColor:
for card_id in card_ids:
if not full_deck[card_id].color == Card.CardColor.WHITE:
return full_deck[card_id].color
return Card.CardColor.WHITE
func _get_card_name(card_id: int) -> String:
var color: String
var suffix: String
if card_id > 51 and card_id < 56:
return "jester"
elif card_id > 55:
return "magician"
match get_card_color(card_id):
Card.CardColor.BLUE:
color = "blue"
Card.CardColor.GREEN:
color = "green"
Card.CardColor.RED:
color = "violet"
Card.CardColor.YELLOW:
color = "orange"
match card_id:
0, 13, 26, 39:
suffix = "1"
1, 14, 27, 40:
suffix = "2"
2, 15, 28, 41:
suffix = "3"
3, 16, 29, 42:
suffix = "4"
4, 17, 30, 43:
suffix = "5"
5, 18, 31, 44:
suffix = "6"
6, 19, 32, 45:
suffix = "7"
7, 20, 33, 46:
suffix = "8"
8, 21, 34, 47:
suffix = "9"
9, 22, 35, 48:
suffix = "10"
10, 23, 36, 49:
suffix = "11"
11, 24, 37, 50:
suffix = "12"
12, 25, 38, 51:
suffix = "13"
return color + "_" + suffix
func get_card_color(card_id: int) -> Card.CardColor:
if card_id < 13:
return Card.CardColor.BLUE
elif card_id < 26:
return Card.CardColor.GREEN
elif card_id < 39:
return Card.CardColor.RED
elif card_id < 52:
return Card.CardColor.YELLOW
else:
return Card.CardColor.WHITE