167 lines
No EOL
4.7 KiB
GDScript
167 lines
No EOL
4.7 KiB
GDScript
extends Node
|
|
class_name Player
|
|
|
|
var attached_cards: Dictionary = {}
|
|
var attached_effects: Dictionary = {}
|
|
var hand_size: int = 2
|
|
var gold: int = 70
|
|
var tokens: int = 1
|
|
var game: ChessGame
|
|
var run_count: int = 0
|
|
const MAX_HAND_SIZE = 5
|
|
var unlocked_cards = []
|
|
|
|
var cards_by_rank = {
|
|
Card.Rank.RANK_0: [], # Most powerful (one-time use)
|
|
Card.Rank.RANK_1: [], # Once per match
|
|
Card.Rank.RANK_2: [], # Discard pile cards
|
|
Card.Rank.RANK_3: [] # Basic cards
|
|
}
|
|
|
|
var cards_by_name = {}
|
|
func _init(g: int, size: int, tok: int, gm: ChessGame):
|
|
print("INIT PLAYER CHARACTER")
|
|
# var classList = ProjectSettings.get_global_class_list();
|
|
# for classType in classList:
|
|
# if classType.base == "Card":
|
|
# print("ALL CARDS ", classType)
|
|
gold = g
|
|
tokens = tok
|
|
game = gm
|
|
hand_size = size
|
|
update_deck_hand_size(size)
|
|
load_all_cards()
|
|
initialize_deck_from_defaults(unlocked_cards)
|
|
# Debug output
|
|
print_card_list()
|
|
|
|
|
|
func initialize_deck_from_defaults(unlocked_cards: Array = []):
|
|
if "deckManager" in game:
|
|
game.deckManager.initializeStartingDeck(unlocked_cards)
|
|
|
|
|
|
func update_deck_hand_size(size: int):
|
|
if "deckManager" in game:
|
|
game.deckManager.set_hand_size(hand_size)
|
|
|
|
func set_hand_size(size: int):
|
|
hand_size = size
|
|
|
|
func get_tokens() -> int:
|
|
return tokens
|
|
|
|
func set_tokens(amount: int) -> void:
|
|
tokens = amount
|
|
|
|
func remove_tokens(amount: int) -> void:
|
|
tokens = max(0, tokens - amount)
|
|
|
|
func add_tokens(t: int) -> void :
|
|
tokens += t
|
|
|
|
func increment_runs() -> void :
|
|
run_count += 1
|
|
|
|
func get_run_count() -> int :
|
|
return run_count
|
|
|
|
func get_gold() -> int :
|
|
return gold
|
|
|
|
func add_gold(g: int) -> void :
|
|
gold += g
|
|
|
|
func remove_gold(g: int) -> void :
|
|
gold -= g
|
|
|
|
func set_gold(g: int) -> void :
|
|
gold = g
|
|
|
|
func unlock_card(card_instance):
|
|
unlocked_cards.append(card_instance)
|
|
|
|
func load_all_cards():
|
|
var class_list = ProjectSettings.get_global_class_list()
|
|
|
|
print("Loading all card classes...")
|
|
|
|
for class_info in class_list:
|
|
if class_info.base == "Card":
|
|
var cname = class_info["class"]
|
|
print("Found card class: ", cname)
|
|
|
|
var script_path = class_info["path"]
|
|
var card_script = load(script_path)
|
|
|
|
if card_script == null:
|
|
print("Couldn't load script: ", script_path)
|
|
continue
|
|
|
|
var card_instance = card_script.new()
|
|
if card_instance.is_default:
|
|
unlocked_cards.append(card_instance)
|
|
cards_by_name[card_instance.cardName] = card_instance
|
|
|
|
if card_instance.rank in cards_by_rank:
|
|
cards_by_rank[card_instance.rank].append(card_instance)
|
|
else:
|
|
print("Warning: Card has unknown rank: ", card_instance.cardName, " (", card_instance.rank, ")")
|
|
|
|
print("Successfully loaded card: ", card_instance.cardName, " (Rank ", card_instance.rank, ")")
|
|
|
|
print("Card loading complete. Loaded ", cards_by_name.size(), " cards.")
|
|
|
|
|
|
|
|
func print_card_list():
|
|
print("\n--- CARD LIST BY RANK ---")
|
|
|
|
for rank in cards_by_rank:
|
|
var rank_name = ""
|
|
match rank:
|
|
Card.Rank.RANK_0: rank_name = "RANK 0 (One-time use)"
|
|
Card.Rank.RANK_1: rank_name = "RANK 1 (Once per match)"
|
|
Card.Rank.RANK_2: rank_name = "RANK 2 (Discard pile)"
|
|
Card.Rank.RANK_3: rank_name = "RANK 3 (Basic)"
|
|
_: rank_name = "UNKNOWN RANK"
|
|
|
|
print("\n" + rank_name + " (" + str(cards_by_rank[rank].size()) + " cards):")
|
|
|
|
for card in cards_by_rank[rank]:
|
|
print(" - " + card.cardName)
|
|
|
|
print("\n--- END CARD LIST ---\n")
|
|
print("\n--- UNLOCKED CARD LIST ---")
|
|
for card in unlocked_cards:
|
|
print(" - " + card.cardName)
|
|
print("\n--- END UNLOCKED CARD LIST ---\n")
|
|
|
|
|
|
|
|
|
|
func get_card(card_name: String) -> Card:
|
|
if card_name in cards_by_name:
|
|
return cards_by_name[card_name].duplicate()
|
|
return null
|
|
|
|
func get_random_card(rank: int) -> Card:
|
|
if rank in cards_by_rank and not cards_by_rank[rank].is_empty():
|
|
var random_index = randi() % cards_by_rank[rank].size()
|
|
return cards_by_rank[rank][random_index].duplicate()
|
|
return null
|
|
|
|
func get_cards_by_rank(rank: int) -> Array:
|
|
if rank in cards_by_rank:
|
|
var result = []
|
|
for card in cards_by_rank[rank]:
|
|
result.append(card.duplicate())
|
|
return result
|
|
return []
|
|
|
|
func get_all_cards() -> Array:
|
|
var result = []
|
|
for rank in cards_by_rank:
|
|
for card in cards_by_rank[rank]:
|
|
result.append(card.duplicate())
|
|
return result |