ChessBuilder/Systems/Game/Menu/MenuContainer.gd

489 lines
17 KiB
GDScript

extends Control
class_name MenuContainer
const VERSION_FILE_PATH = "res://Game.json"
# Signal to notify parent when a new game is requested
# signal new_game_requested
signal reward_closed(node)
signal new_game_requested(options)
signal shop_open_requested(options)
signal reward_open_requested(options)
signal deckmanager_open_requested(options)
signal map_open_requested(options)
signal node_completed(options)
signal shop_closed
signal card_purchased(card, price)
signal card_unlocked(card, price)
signal lobby_open_requested(options)
signal lobby_shop_open_requested(options)
signal vanilla_mode_selected
signal deeper_mode_selected
@onready var newGameButton = $HBoxContainer/VBoxContainer/MenuOptions/NewGameText
@onready var continueButton = $HBoxContainer/VBoxContainer/MenuOptions/Continue
@onready var optionsButton = $HBoxContainer/VBoxContainer/MenuOptions/Options
@onready var versionText = $HBoxContainer/VBoxContainer/VersionText
@onready var titleText = $HBoxContainer/VBoxContainer/TitleText
@onready var developerText = $HBoxContainer/VBoxContainer/DeveloperText
@onready var gameMenuScreen = get_node("/root/Board/GameMenuScreen")
@onready var deckManagerScreen = get_node("/root/Board/DeckManagerScreen")
@onready var mapScreen = get_node("/root/Board/MapScreen")
@onready var stateMachine = get_node("/root/Board/StateMachine")
@onready var shopScreen = get_node("/root/Board/ShopScreen")
@onready var progressionScreen = get_node("/root/Board/ProgressionScreen")
@onready var rewardScreen = get_node("/root/Board/RewardScreen")
@onready var game = get_node_or_null("/root/Board") as ChessGame
@onready var lobbyScreen = get_node_or_null("/root/Board/LobbyScreen")
@onready var lobbyShopScreen = get_node_or_null("/root/Board/LobbyShopScreen")
@onready var preloadhandScreen = get_node_or_null("/root/Board/HandPreloadScreen")
var player_gold = 10
var back_to_map = false
var winConditionManager: WinConditionManager
var currentWinCondition = Utils.WinConditionType.CAPTURE_UNIT
var currentLossCondition = Utils.LossConditionType.UNIT_LOST
func _ready():
# Connect menu option signals
_connect_button(newGameButton, "_on_new_game_pressed")
_connect_button(continueButton, "_on_continue_pressed")
_connect_button(optionsButton, "_on_options_pressed")
if gameMenuScreen:
gameMenuScreen.setup(self)
gameMenuScreen.connect("shop_open_requested", Callable(self, "_on_shop_open_requested"))
gameMenuScreen.connect("deckmanager_open_requested", Callable(self, "_on_deckmanager_open_requested"))
gameMenuScreen.connect("map_open_requested", Callable(self, "_on_map_open_requested"))
gameMenuScreen.connect("new_game_requested", Callable(self, "_on_start_game_pressed"))
gameMenuScreen.connect("reward_open_requested", Callable(self, "_on_reward_open_requested"))
gameMenuScreen.connect("lobby_open_requested", Callable(self, "_on_lobby_open_requested"))
gameMenuScreen.visible = false
else:
connect("map_open_requested", Callable(self, "_on_map_open_requested"))
connect("reward_closed", Callable(self, "_on_reward_completed"))
game.connect("node_completed", Callable(self, "_on_node_completed"))
if deckManagerScreen:
deckManagerScreen.connect("back_pressed", Callable(self, "_on_deck_manager_back_pressed"))
deckManagerScreen.visible = false
if preloadhandScreen:
preloadhandScreen.connect("back_pressed", Callable(self, "_on_preload_back_pressed"))
preloadhandScreen.visible = false
if progressionScreen:
progressionScreen.connect("save_pressed", Callable(self, "_on_progression_save_pressed"))
progressionScreen.visible = false
if mapScreen:
mapScreen.connect("back_pressed", Callable(self, "_on_map_back_pressed"))
mapScreen.connect("deckmanager_open_requested", Callable(self, "_on_deckmanager_open_requested_from_map"))
mapScreen.connect("node_selected", Callable(self, "_on_map_node_selected"))
mapScreen.visible = false
if shopScreen:
shopScreen.connect("back_pressed", Callable(self, "_on_shop_back_pressed"))
shopScreen.connect("card_purchased", Callable(self, "_on_shop_card_purchased"))
shopScreen.visible = false
if rewardScreen:
rewardScreen.connect("back_pressed", Callable(self, "_on_reward_back_pressed"))
rewardScreen.connect("card_purchased", Callable(self, "_on_reward_card"))
rewardScreen.visible = false
if lobbyScreen:
lobbyScreen.connect("vanilla_selected", Callable(self, "_on_vanilla_selected"))
lobbyScreen.connect("preload_selected", Callable(self, "_on_preload_selected"))
lobbyScreen.connect("shop_selected", Callable(self, "_on_lobby_shop_open_requested"))
lobbyScreen.connect("deeper_selected", Callable(self, "_on_deeper_selected"))
lobbyScreen.connect("back_pressed", Callable(self, "_on_lobby_back_pressed"))
# lobbyScreen.connect("map_open_requested", Callable(self, "_on_map_open_requested"))
lobbyScreen.visible = false
if lobbyShopScreen:
lobbyShopScreen.connect("back_pressed", Callable(self, "_on_lobby_shop_back_pressed"))
lobbyShopScreen.connect("card_unlocked", Callable(self, "_on_lobby_shop_card_unlocked"))
lobbyShopScreen.connect("hand_size_increased", Callable(self, "_on_hand_size_increased"))
lobbyShopScreen.visible = false
load_version()
func load_version():
var version = "v.0.0.0"
var title = "ChessBuilder"
var developer = ""
var file = FileAccess.open(VERSION_FILE_PATH, FileAccess.READ)
if file:
var json_text = file.get_as_text()
file.close()
# Parse the JSON
var json = JSON.new()
var error = json.parse(json_text)
if error == OK:
var data = json.get_data()
if data and typeof(data) == TYPE_DICTIONARY and data.has("version"):
version = "v " + str(data.version)
if data and typeof(data) == TYPE_DICTIONARY and data.has("title"):
title = str(data.title)
if data and typeof(data) == TYPE_DICTIONARY and data.has("developer"):
developer = str(data.developer)
else:
print("JSON Parse Error: ", json.get_error_message())
if versionText:
versionText.text = version
if titleText:
titleText.text = title
if developerText:
developerText.text = developer
# Connect a button signal to a method
func _connect_button(button, method_name):
if button and button.has_signal("pressed"):
if !button.is_connected("pressed", Callable(self, method_name)):
button.connect("pressed", Callable(self, method_name))
func _on_preload_back_pressed():
if preloadhandScreen:
preloadhandScreen.visible = false
if lobbyScreen:
lobbyScreen.visible = true
# Handle New Game button press
func _on_new_game_pressed():
print("New Game pressed, showing game menu")
self.visible = false
if gameMenuScreen:
gameMenuScreen.visible = true
# _on_map_open_requested({})
# emit_signal("new_game_requested")
func _on_lobby_open_requested(options):
print("Lobby requested with options:", options)
if gameMenuScreen:
gameMenuScreen.visible = false
if lobbyScreen:
lobbyScreen.visible = true
lobbyScreen.initialize(options)
lobbyScreen.show_screen()
print("_on_lobby_open_requested" )
func _on_lobby_back_pressed():
if lobbyScreen:
lobbyScreen.visible = false
self.visible = true
func _on_preload_selected():
print("Preload mode selected")
preloadhandScreen.initialize(null)
preloadhandScreen.visible = true
func _on_vanilla_selected():
print("Vanilla mode selected")
if gameMenuScreen:
gameMenuScreen.visible = true
_on_map_open_requested({"mode": "vanilla", "hand_size": 2, })
# emit_signal("vanilla_mode_selected")
func _on_deeper_selected():
print("Deeper mode selected")
if gameMenuScreen:
gameMenuScreen.visible = true
_on_map_open_requested({"mode": "deeper", "hand_size": game.player.hand_size,})
func _on_lobby_shop_open_requested(options):
print("Lobby Shop requested with options:", options)
if lobbyScreen:
lobbyScreen.visible = false
if lobbyShopScreen:
lobbyShopScreen.visible = true
lobbyShopScreen.initialize(options)
emit_signal("lobby_shop_open_requested", options)
func _on_lobby_shop_back_pressed():
if lobbyShopScreen:
lobbyShopScreen.visible = false
if lobbyScreen:
lobbyScreen.visible = true
func _on_lobby_shop_card_unlocked(card, token_cost):
# Add the card to the player's bank
if game and "deckManager" in game:
var deck_manager = game.deckManager
game.player.unlock_card(card)
print("Added unlocked card to whitelist: ", card.cardName)
func _on_hand_size_increased():
print("Hand size increased")
# Handle Continue button press
func _on_continue_pressed():
print("Continue pressed")
# Implement continue game logic here
# self.visible = false
# You can add logic to load a saved game if needed
# Handle Options button press
func _on_options_pressed():
print("Options pressed")
# Implement options menu logic here
# You could show an options panel or switch to an options menu
# Game Menu Screen Signals
func _on_shop_open_requested(options):
print("Shop requested with options:", options)
if gameMenuScreen:
gameMenuScreen.visible = false
if options == null:
options = {}
if "gold" in options:
options["gold"] = game.player.get_gold()
if mapScreen:
mapScreen.visible = false
if shopScreen:
shopScreen.visible = true
shopScreen.initialize(options)
emit_signal("shop_open_requested", options)
func _on_shop_back_pressed():
if shopScreen:
shopScreen.visible = false
game.player.set_gold(shopScreen.player_gold)
# Show game menu again
if not back_to_map and gameMenuScreen:
gameMenuScreen.visible = true
if back_to_map:
mapScreen.visible = true
# Emit signal that shop was closed
emit_signal("shop_closed")
func _on_shop_card_purchased(card, price):
game.player.remove_gold(price)
# Forward the signal
emit_signal("card_purchased", card, price)
# Add the card to the player's bank
if game and "deckManager" in game:
var deck_manager = game.deckManager
deck_manager.bank.append(card)
print("Added purchased card to bank:", card.cardName)
func _on_reward_open_requested(options):
print("Reward requested with options:", options)
if shopScreen:
shopScreen.visible = false
if options == null:
options = {}
if "gold" in options.metadata:
options.metadata["gold"] = game.player.get_gold()
if rewardScreen:
rewardScreen.visible = true
rewardScreen.initialize(options)
emit_signal("reward_open_requested", options)
func _on_reward_back_pressed(completed_node):
if rewardScreen:
rewardScreen.visible = false
if not back_to_map and gameMenuScreen:
gameMenuScreen.visible = true
if back_to_map:
mapScreen.visible = true
print("DONE: ", completed_node)
var is_escape = completed_node.metadata.is_escape
emit_signal("reward_closed", completed_node)
func _on_reward_card(card, price):
# Forward the signal
emit_signal("card_purchased", card, price)
# Add the card to the player's bank
if game and "deckManager" in game:
var deck_manager = game.deckManager
deck_manager.bank.append(card)
print("Added reward card to bank:", card.cardName)
func _on_reward_completed(completed_node):
var is_escape = completed_node.metadata.is_escape
if progressionScreen and is_escape:
progressionScreen.initialize({"max_deck_size": 10, "node": completed_node})
if completed_node.type == Utils.RoomType.FINAL:
game.player.add_tokens(1)
progressionScreen.visible = true
func _on_progression_save_pressed():
print("_on_progression_save_pressed")
progressionScreen.visible = false
gameMenuScreen.visible = false
_on_lobby_open_requested(null)
func _on_deckmanager_open_requested_from_map(options):
print("Deck Manager requested with options:", options)
# Hide game menu
gameMenuScreen.visible = false
# Show and initialize deck manager
if deckManagerScreen:
deckManagerScreen.visible = true
deckManagerScreen.initialize(options)
back_to_map = true
# Also emit signal for other systems that might need to know
emit_signal("deckmanager_open_requested", options)
func _on_deckmanager_open_requested(options):
print("Deck Manager requested with options:", options)
# Hide game menu
gameMenuScreen.visible = false
# Show and initialize deck manager
if deckManagerScreen:
deckManagerScreen.visible = true
deckManagerScreen.initialize(options)
# Also emit signal for other systems that might need to know
emit_signal("deckmanager_open_requested", options)
func _on_deck_manager_back_pressed():
# Return to game menu screen
deckManagerScreen.visible = false
if not back_to_map:
gameMenuScreen.visible = true
else:
mapScreen.visible = true
func _on_map_open_requested(options):
print("Map requested with options:", options)
gameMenuScreen.visible = false
if "hand_size" in options:
game.player.update_deck_hand_size(options.hand_size)
if mapScreen:
mapScreen.generate_map({"mode": options.mode})
mapScreen.display_map()
mapScreen.visible = true
emit_signal("map_open_requested", options)
func _on_start_game_pressed(options):
print("Starting game with options:", options)
emit_signal("new_game_requested", options)
func _on_map_back_pressed():
mapScreen.visible = false
gameMenuScreen.visible = true
# Map node selection
func _on_map_node_selected(node_data):
print("Selected map node: ", node_data)
if node_data.type == Utils.RoomType.SHOP:
print("Utils.RoomType.SHOP")
back_to_map = true
_on_shop_open_requested(node_data.metadata)
elif node_data.type == Utils.RoomType.FINAL:
print("Utils.RoomType.FINAL")
if gameMenuScreen:
gameMenuScreen.visible = false
if deckManagerScreen:
deckManagerScreen.visible = false
if mapScreen:
mapScreen.visible = false
back_to_map = true
_on_start_game_pressed(node_data)
elif node_data.type == Utils.RoomType.NORMAL:
print("Utils.RoomType.NORMAL")
if gameMenuScreen:
gameMenuScreen.visible = false
if deckManagerScreen:
deckManagerScreen.visible = false
if mapScreen:
mapScreen.visible = false
back_to_map = true
_on_start_game_pressed(node_data)
elif node_data.type == Utils.RoomType.BOSS:
print("Utils.RoomType.BOSS")
if gameMenuScreen:
gameMenuScreen.visible = false
if deckManagerScreen:
deckManagerScreen.visible = false
if mapScreen:
mapScreen.visible = false
back_to_map = true
_on_start_game_pressed(node_data)
elif node_data.type == Utils.RoomType.EVENT:
print("Utils.RoomType.EVENT")
if gameMenuScreen:
gameMenuScreen.visible = false
if deckManagerScreen:
deckManagerScreen.visible = false
if mapScreen:
mapScreen.visible = false
back_to_map = true
_on_start_game_pressed(node_data)
func _on_node_completed(options):
var node_data = options.node
var completed = options.completed
var success = options.success
if success:
_on_reward_open_requested(node_data)
print("**********************************")
print("**********************************")
print("**********************************")
print("**********************************")
print("**************MATCH***************")
print("**************OVER****************")
print("**********************************")
print("**********************************")
print("**********************************")
print("**********************************")
else:
print("**********************************")
print("**********************************")
print("**********************************")
print("**********************************")
print("**************GAME****************")
print("**************OVER****************")
print("*************GITGUD***************")
print("**********************************")
print("**********************************")
print("**********************************")
# Public method to show the menu
func show_menu():
self.visible = true
if gameMenuScreen:
gameMenuScreen.visible = false
if deckManagerScreen:
deckManagerScreen.visible = false
if mapScreen:
mapScreen.visible = false