ChessBuilder/Systems/DeckManager.gd

228 lines
7 KiB
GDScript

extends Node
class_name DeckManager
var deck: Array = []
var hand: Array = []
var bank: Array = []
var discard: Array = []
var attached_cards: Dictionary = {} # piece_id: card
var attached_effects: Dictionary = {} # piece_id: [card]
var hand_size: int = 5
# Card costs for shop
func _init():
print("************************DECK INIT*****************")
func set_hand_size(size: int):
hand_size = size
func initializeStartingDeck(starting_cards: Array = []):
deck.clear();
# addCardToDeck(ExplosiveBootsCard.new())
# addCardToDeck(DoubleTimeCard.new())
# # addCardToDeck(DrunkDrivingCard.new())
# addCardToDeck(SupernovaCard.new())
print("Initializing deck with " + str(starting_cards.size()) + " cards")
for template_card in starting_cards:
# Create a new instance of the same card type
var new_card = create_new_card_instance(template_card)
if new_card:
addCardToDeck(new_card)
else:
print("Failed to create card: " + template_card.cardName)
func initializeStartingBank():
bank.append(HopscotchCard.new())
bank.append(FieryCapeCard.new())
bank.append(FieryTrailCard.new())
bank.append(ExplosiveBootsCard.new())
bank.append(DoubleTimeCard.new())
bank.append(DrunkDrivingCard.new())
bank.append(SupernovaCard.new())
for i in range(3):
bank.append(HopscotchCard.new())
bank.append(FieryCapeCard.new())
func shuffleDeck():
deck.shuffle()
func drawStartingHand():
for i in range(min(hand_size, deck.size())):
drawCard()
func drawCard():
if deck.is_empty() && !discard.is_empty():
deck = discard.duplicate()
discard.clear()
shuffleDeck()
if !deck.is_empty() && hand.size() < hand_size:
hand.append(deck.pop_back())
emit_signal("hand_updated", hand)
signal hand_updated
func addCardToDeck(card: Card):
deck.insert(0, card)
func playCard(card: Card, target_piece: Pawn, board_flow = null, game_state = null, avoidHand = false):
if !avoidHand and !hand.has(card):
# print("Failed Play Card 1")
return false
if card.duration > 0:
attached_cards[target_piece.get_instance_id()] = card
if card.apply_effect(target_piece, board_flow, game_state):
if card.duration > 0:
attached_cards[target_piece.get_instance_id()] = card
hand.erase(card)
emit_signal("hand_updated", hand)
return true
# print("Failed Play Card 2")
return false
func playEffect(card: Card, target_piece: Pawn, board_flow = null, game_state = null):
var key = target_piece.get_instance_id();
if !attached_effects.has(key):
attached_effects[key] = []
else:
for existing_card in attached_effects[key]:
if existing_card.cardName == card.cardName:
# Card already exists, don't add it again
return false
if card.apply_effect(target_piece, board_flow, game_state):
if card.duration > 0:
attached_effects[key].append(card)
return true
# print("Failed Play Card 2")
return false
func cleanup():
if hand.size() > 0:
for card in hand:
deck.push_back(card)
hand.clear()
func updateEffectDurations():
var expired_entries = [] # Store [piece_id, card_id] pairs to remove
for piece_id in attached_effects:
var cards_to_remove = [] # Track which cards to remove from this piece's array
for card in attached_effects[piece_id]:
card.update_duration()
if card.remaining_turns <= 0:
cards_to_remove.append(card)
else:
var piece_node = instance_from_id(piece_id)
if is_instance_valid(piece_node):
piece_node.update_appearance()
# Remove expired cards from this piece's array
for card in cards_to_remove:
attached_effects[piece_id].erase(card)
# If no cards left for this piece, mark the piece_id for removal
if attached_effects[piece_id].is_empty():
expired_entries.append(piece_id)
var piece_node = instance_from_id(piece_id)
if is_instance_valid(piece_node):
piece_node.update_appearance()
# Remove empty entries
for piece_id in expired_entries:
attached_effects.erase(piece_id)
func updateCardDurations():
var expired_cards = []
for piece_id in attached_cards:
var card = attached_cards[piece_id]
card.update_duration()
# print("Card: ", card.id, " | ", card.cardName, " | ", card.remaining_turns)
if card.remaining_turns <= 0:
expired_cards.append(piece_id)
card.reset()
match card.rank:
Card.Rank.RANK_0:
print("Rank 3 Burned permanently")
pass
Card.Rank.RANK_1:
print("Rank 3 Burned until next match")
pass
Card.Rank.RANK_2:
print("Rank 2 add to Discard")
discard.append(card)
pass
Card.Rank.RANK_3:
addCardToDeck(card)
print("Rank 3 add to Deck")
pass
else:
var piece_node = instance_from_id(piece_id)
if is_instance_valid(piece_node):
piece_node.update_appearance()
for piece_id in expired_cards:
attached_cards.erase(piece_id)
var piece_node = instance_from_id(piece_id)
if is_instance_valid(piece_node):
piece_node.update_appearance()
# print("updateCardDurations", attached_cards)
# Shop functionality
func getShopCards(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": calculateCardCost(card)
#})
return shop_cards
func calculateCardCost(card: Card) -> int:
var base_cost = Utils.CardPrices[card.rank]
# Add modifiers based on card effects
return base_cost
func upgradeCard(card: Card) -> bool:
# Implement card upgrading logic
return false
func create_new_card_instance(template_card: Card) -> Card:
var new_card = null
var script = template_card.get_script()
if script:
new_card = script.new()
else:
print("Warning: Could not get script from card: " + template_card.cardName)
var class_list = ProjectSettings.get_global_class_list()
var card_class_name = template_card.get_class()
for class_info in class_list:
if class_info["class"] == card_class_name:
var card_script = load(class_info["path"])
if card_script:
new_card = card_script.new()
break
return new_card