153 lines
4.5 KiB
GDScript
153 lines
4.5 KiB
GDScript
extends Control
|
|
|
|
const GAMEPLAY_SCENES = {
|
|
"match3": "res://scenes/game/gameplays/Match3Gameplay.tscn",
|
|
"clickomania": "res://scenes/game/gameplays/ClickomaniaGameplay.tscn"
|
|
}
|
|
|
|
var current_gameplay_mode: String
|
|
var global_score: int = 0:
|
|
set = set_global_score
|
|
|
|
@onready var back_button: Button = $BackButtonContainer/BackButton
|
|
@onready var gameplay_container: Control = $GameplayContainer
|
|
@onready var score_display: Label = $UI/ScoreDisplay
|
|
|
|
|
|
func _ready() -> void:
|
|
if not back_button.pressed.is_connected(_on_back_button_pressed):
|
|
back_button.pressed.connect(_on_back_button_pressed)
|
|
|
|
# GameManager will set the gameplay mode, don't set default here
|
|
DebugManager.log_debug(
|
|
"Game _ready() completed, waiting for GameManager to set gameplay mode",
|
|
"Game"
|
|
)
|
|
|
|
|
|
func set_gameplay_mode(mode: String) -> void:
|
|
DebugManager.log_info(
|
|
"set_gameplay_mode called with mode: %s" % mode, "Game"
|
|
)
|
|
current_gameplay_mode = mode
|
|
await load_gameplay(mode)
|
|
DebugManager.log_info(
|
|
"set_gameplay_mode completed for mode: %s" % mode, "Game"
|
|
)
|
|
|
|
|
|
func load_gameplay(mode: String) -> void:
|
|
DebugManager.log_debug("Loading gameplay mode: %s" % mode, "Game")
|
|
|
|
# Clear existing gameplay and wait for removal
|
|
var existing_children = gameplay_container.get_children()
|
|
if existing_children.size() > 0:
|
|
DebugManager.log_debug(
|
|
"Removing %d existing children" % existing_children.size(), "Game"
|
|
)
|
|
for child in existing_children:
|
|
DebugManager.log_debug(
|
|
"Removing existing child: %s" % child.name, "Game"
|
|
)
|
|
child.queue_free()
|
|
|
|
# Wait for children to be properly removed from scene tree
|
|
await get_tree().process_frame
|
|
DebugManager.log_debug(
|
|
(
|
|
"Children removal complete, container count: %d"
|
|
% gameplay_container.get_child_count()
|
|
),
|
|
"Game"
|
|
)
|
|
|
|
# Load new gameplay
|
|
if GAMEPLAY_SCENES.has(mode):
|
|
DebugManager.log_debug(
|
|
"Found scene path: %s" % GAMEPLAY_SCENES[mode], "Game"
|
|
)
|
|
var gameplay_scene = load(GAMEPLAY_SCENES[mode])
|
|
var gameplay_instance = gameplay_scene.instantiate()
|
|
DebugManager.log_debug(
|
|
"Instantiated gameplay: %s" % gameplay_instance.name, "Game"
|
|
)
|
|
gameplay_container.add_child(gameplay_instance)
|
|
DebugManager.log_debug(
|
|
(
|
|
"Added gameplay to container, child count now: %d"
|
|
% gameplay_container.get_child_count()
|
|
),
|
|
"Game"
|
|
)
|
|
|
|
# Connect gameplay signals to shared systems
|
|
if gameplay_instance.has_signal("score_changed"):
|
|
gameplay_instance.score_changed.connect(_on_score_changed)
|
|
DebugManager.log_debug("Connected score_changed signal", "Game")
|
|
else:
|
|
DebugManager.log_error(
|
|
"Gameplay mode '%s' not found in GAMEPLAY_SCENES" % mode, "Game"
|
|
)
|
|
|
|
|
|
func set_global_score(value: int) -> void:
|
|
global_score = value
|
|
if score_display:
|
|
score_display.text = "Score: " + str(global_score)
|
|
|
|
|
|
func _on_score_changed(points: int) -> void:
|
|
self.global_score += points
|
|
SaveManager.update_current_score(self.global_score)
|
|
|
|
|
|
func get_global_score() -> int:
|
|
return global_score
|
|
|
|
|
|
func _get_current_gameplay_instance() -> Node:
|
|
if gameplay_container.get_child_count() > 0:
|
|
return gameplay_container.get_child(0)
|
|
return null
|
|
|
|
|
|
func _on_back_button_pressed() -> void:
|
|
DebugManager.log_debug("Back button pressed in game scene", "Game")
|
|
AudioManager.play_ui_click()
|
|
|
|
# Save current grid state if we have an active match3 gameplay
|
|
var gameplay_instance = _get_current_gameplay_instance()
|
|
if gameplay_instance and gameplay_instance.has_method("save_current_state"):
|
|
DebugManager.log_info("Saving grid state before exit", "Game")
|
|
# Make sure the gameplay instance is still valid and not being destroyed
|
|
if (
|
|
is_instance_valid(gameplay_instance)
|
|
and gameplay_instance.is_inside_tree()
|
|
):
|
|
gameplay_instance.save_current_state()
|
|
else:
|
|
DebugManager.log_warn(
|
|
"Gameplay instance invalid, skipping grid save on exit", "Game"
|
|
)
|
|
|
|
# Save the current score immediately before exiting
|
|
SaveManager.finish_game(global_score)
|
|
GameManager.exit_to_main_menu()
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("ui_back"):
|
|
# Handle gamepad/keyboard back action - same as back button
|
|
_on_back_button_pressed()
|
|
elif (
|
|
event.is_action_pressed("action_south")
|
|
and Input.is_action_pressed("action_north")
|
|
):
|
|
# Debug: Switch to clickomania when primary+secondary actions pressed together
|
|
if current_gameplay_mode == "match3":
|
|
set_gameplay_mode("clickomania")
|
|
DebugManager.log_debug("Switched to clickomania gameplay", "Game")
|
|
else:
|
|
set_gameplay_mode("match3")
|
|
DebugManager.log_debug("Switched to match3 gameplay", "Game")
|