175 lines
4.9 KiB
GDScript
175 lines
4.9 KiB
GDScript
extends Node
|
|
|
|
@export var full_deck: Dictionary[int, Card]
|
|
@export var card_fallback_texture: Texture
|
|
|
|
enum CardStyle {
|
|
STICKMAN,
|
|
}
|
|
|
|
func _ready() -> void:
|
|
# magician wins
|
|
assert(get_winning_card([1, 2, 3, 59], -1) == 59)
|
|
assert(get_winning_card([1, 2, 3, 59], 3) == 59)
|
|
assert(get_winning_card([57, 2, 3, 59], 3) == 57)
|
|
# trump wins
|
|
assert(get_winning_card([1, 14, 2, 3], 4) == 3)
|
|
assert(get_winning_card([29, 14, 27, 31], 15) == 14)
|
|
assert(get_winning_card([1, 12, 6, 31], 30) == 31)
|
|
# joker win
|
|
assert(get_winning_card([54, 52, 55, 53], 31) == 54)
|
|
# other wins
|
|
assert(get_winning_card([14, 15, 18, 13], 16) == 18)
|
|
assert(get_winning_card([14, 15, 18, 13], 46) == 18)
|
|
# trumpless win
|
|
assert(get_winning_card([28, 12, 31, 13], -1) == 31)
|
|
|
|
# score calculation tests
|
|
assert(BetResult.new(1, 1).get_score() == 30)
|
|
assert(BetResult.new(0, 0).get_score() == 20)
|
|
assert(BetResult.new(4, 4).get_score() == 60)
|
|
assert(BetResult.new(1, 2).get_score() == -10)
|
|
assert(BetResult.new(1, 4).get_score() == -30)
|
|
assert(BetResult.new(4, 1).get_score() == -30)
|
|
|
|
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:
|
|
print("ids: " + str(card_ids) + ", trump: " + str(trump))
|
|
if card_ids.has(56) or card_ids.has(57) or card_ids.has(58) or card_ids.has(59):
|
|
# cards contain magician
|
|
print("checking magician route")
|
|
for card_id in card_ids:
|
|
if full_deck[card_id].card_type == Card.CardType.MAGICIAN:
|
|
print("picked magician")
|
|
return card_id
|
|
return -1 # should not happen
|
|
elif not trump == -1:
|
|
# trump exists, determine winner from this
|
|
print("trump route")
|
|
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:
|
|
print("picked " + str(largest_trump_card_id))
|
|
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
|
|
print("nontrump route")
|
|
var first_color: Card.CardColor = _get_first_color_card(card_ids)
|
|
if first_color == Card.CardColor.WHITE:
|
|
print("all 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
|
|
print("picked " + str(largest_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"
|
|
|
|
elif card_id < 13:
|
|
color = "blue"
|
|
elif card_id < 26:
|
|
color = "green"
|
|
elif card_id < 39:
|
|
color = "violet"
|
|
else:
|
|
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"
|
|
52, 53, 54, 55:
|
|
suffix = "joker"
|
|
56, 57, 58, 59:
|
|
suffix = "magician"
|
|
|
|
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
|