142 lines
3.5 KiB
GDScript
142 lines
3.5 KiB
GDScript
extends Node
|
|
class_name DeckManager
|
|
|
|
const DoubleTimeCard = preload("res://Systems/Cards/Doubletime.gd")
|
|
const HopscotchCard = preload("res://Systems/Cards/Hopscotch.gd")
|
|
const DrunkDrivingCard = preload("res://Systems/Cards/Drunkdriving.gd")
|
|
|
|
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():
|
|
initializeStartingDeck()
|
|
|
|
func initializeStartingDeck():
|
|
deck.clear();
|
|
for i in range(3):
|
|
deck.append(DoubleTimeCard.new())
|
|
deck.append(DrunkDrivingCard.new())
|
|
deck.append(HopscotchCard.new())
|
|
shuffleDeck()
|
|
drawStartingHand()
|
|
|
|
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():
|
|
print("*******************************")
|
|
print("*******************************")
|
|
print("*******************************")
|
|
print("*******************************")
|
|
print("********ADDING DISCARD TO DECK*")
|
|
print("*******************************")
|
|
print("*******************************")
|
|
print("*******************************")
|
|
print("*******************************")
|
|
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 playCard(card: Card, target_piece: Pawn, board_flow = null, game_state = null):
|
|
if !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 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)
|
|
|
|
|
|
match card.rank:
|
|
Card.Rank.RANK_0:
|
|
# Burned permanently
|
|
pass
|
|
Card.Rank.RANK_1:
|
|
# Burned until next match
|
|
pass
|
|
Card.Rank.RANK_2:
|
|
print("Rank 2 add to Discard")
|
|
discard.append(card)
|
|
# continue
|
|
pass
|
|
Card.Rank.RANK_3:
|
|
deck.append(card)
|
|
# continue
|
|
print("Rank 1 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 = CARD_BASE_COSTS[card.rank]
|
|
# Add modifiers based on card effects
|
|
return base_cost
|
|
|
|
func upgradeCard(card: Card) -> bool:
|
|
# Implement card upgrading logic
|
|
return false
|