228 lines
7 KiB
GDScript
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
|