ChessBuilder/Systems/DeckManager.gd
2025-01-24 20:06:23 -06:00

106 lines
2.3 KiB
GDScript

extends Node
class_name DeckManager
var deck: Array = []
var hand: Array = []
var discard: Array = []
var attached_cards: Dictionary = {} # piece_id: card
var hand_size: int = 5
# Card costs for shop
const CARD_BASE_COSTS = {
Card.Rank.RANK_0: 100,
Card.Rank.RANK_1: 75,
Card.Rank.RANK_2: 50,
Card.Rank.RANK_3: 25
}
func _init():
initialize_starting_deck()
func initialize_starting_deck():
# Add basic Rank 3 and 4 cards as per design doc
for i in range(10):
deck.append(Card.new()) # Basic movement cards
shuffle_deck()
draw_starting_hand()
func shuffle_deck():
deck.shuffle()
func draw_starting_hand():
for i in range(min(hand_size, deck.size())):
draw_card()
func draw_card():
if deck.is_empty() && !discard.is_empty():
deck = discard.duplicate()
discard.clear()
shuffle_deck()
if !deck.is_empty() && hand.size() < hand_size:
hand.append(deck.pop_back())
signal hand_updated
func play_card(card: Card, target_piece: Pawn, board_flow = null, game_state = null):
if !hand.has(card):
return false
emit_signal("hand_updated", hand)
if card.apply_effect(target_piece, board_flow, game_state):
hand.erase(card)
match card.rank:
Card.Rank.RANK_0:
# Burned permanently
pass
Card.Rank.RANK_1:
# Burned until next match
pass
Card.Rank.RANK_2:
discard.append(card)
Card.Rank.RANK_3:
deck.append(card)
shuffle_deck()
if card.duration > 0:
attached_cards[target_piece.get_instance_id()] = card
return true
return false
func update_card_durations():
var expired_cards = []
for piece_id in attached_cards:
var card = attached_cards[piece_id]
card.update_duration()
if card.remaining_turns <= 0:
expired_cards.append(piece_id)
for piece_id in expired_cards:
attached_cards.erase(piece_id)
# Shop functionality
func get_shop_cards(num_cards: int = 3) -> Array:
var shop_cards = []
# Generate random shop selection
#for i in range(num_cards):
#var card = generate_random_card()
#shop_cards.append({
#"card": card,
#"cost": calculate_card_cost(card)
#})
return shop_cards
func calculate_card_cost(card: Card) -> int:
var base_cost = CARD_BASE_COSTS[card.rank]
# Add modifiers based on card effects
return base_cost
func upgrade_card(card: Card) -> bool:
# Implement card upgrading logic
return false