feat: Implement initial game structure with core logic, various managers, player scene, and project configuration.
This commit is contained in:
@@ -7,6 +7,7 @@ extends Node3D
|
||||
# Manager references
|
||||
var ui_manager
|
||||
var obstacle_manager
|
||||
var goals_cycle_manager
|
||||
|
||||
# Minimal local state
|
||||
var _connection_check_timer: float = 0.0
|
||||
@@ -25,6 +26,9 @@ func _ready():
|
||||
# Setup UI
|
||||
ui_manager.setup_action_buttons(_set_action_state_callback)
|
||||
ui_manager.setup_playerboard_ui()
|
||||
ui_manager.setup_timer_labels(self)
|
||||
ui_manager.setup_leaderboard_ui(self)
|
||||
ui_manager.setup_powerup_bar_ui(self)
|
||||
_setup_obstacle_ui()
|
||||
|
||||
# Auto-start game if coming from lobby (already connected to match)
|
||||
@@ -44,6 +48,17 @@ func _init_managers():
|
||||
obstacle_manager.name = "ObstacleManager"
|
||||
add_child(obstacle_manager)
|
||||
obstacle_manager.initialize($EnhancedGridMap)
|
||||
|
||||
# Goals cycle manager for 60-second timer and scoring
|
||||
goals_cycle_manager = load("res://scripts/managers/goals_cycle_manager.gd").new()
|
||||
goals_cycle_manager.name = "GoalsCycleManager"
|
||||
add_child(goals_cycle_manager)
|
||||
goals_cycle_manager.initialize(self)
|
||||
|
||||
# Connect signals for UI updates
|
||||
goals_cycle_manager.timer_updated.connect(_on_timer_updated)
|
||||
goals_cycle_manager.score_updated.connect(_on_score_updated)
|
||||
goals_cycle_manager.leaderboard_updated.connect(_on_leaderboard_updated)
|
||||
|
||||
# Message Bar Configuration
|
||||
const MAX_MESSAGES := 5
|
||||
@@ -248,6 +263,10 @@ func _start_game():
|
||||
TurnManager.reset_turn()
|
||||
var next_player = TurnManager.next_turn(GameStateManager.players)
|
||||
rpc("set_current_turn", next_player)
|
||||
|
||||
# Start the goals cycle timer
|
||||
if goals_cycle_manager:
|
||||
goals_cycle_manager.start_cycle()
|
||||
|
||||
# =============================================================================
|
||||
# Player Management
|
||||
@@ -706,3 +725,72 @@ func sync_grid_item(x: int, y: int, z: int, item: int):
|
||||
var enhanced_gridmap = $EnhancedGridMap
|
||||
if enhanced_gridmap:
|
||||
enhanced_gridmap.set_cell_item(Vector3i(x, y, z), item)
|
||||
|
||||
# =============================================================================
|
||||
# Goals Cycle & Leaderboard UI
|
||||
# =============================================================================
|
||||
|
||||
func _on_timer_updated(time_remaining: float):
|
||||
# Update timer display on all player goal panels
|
||||
var time_text = "%02d:%02d" % [int(time_remaining) / 60, int(time_remaining) % 60]
|
||||
|
||||
for i in range($AllPlayerGoals.get_child_count()):
|
||||
var panel = $AllPlayerGoals.get_child(i)
|
||||
if panel.visible:
|
||||
var timer_label = panel.get_node_or_null("TimerLabel")
|
||||
if timer_label:
|
||||
timer_label.text = time_text
|
||||
|
||||
func _on_score_updated(peer_id: int, new_score: int):
|
||||
# Update player's score display
|
||||
var player = get_node_or_null(str(peer_id))
|
||||
if player:
|
||||
player.score = new_score
|
||||
|
||||
# Update leaderboard UI
|
||||
_update_leaderboard_display()
|
||||
|
||||
func _on_leaderboard_updated(sorted_scores: Array):
|
||||
# Update the leaderboard panel
|
||||
_update_leaderboard_display()
|
||||
|
||||
func _update_leaderboard_display():
|
||||
var leaderboard_panel = get_node_or_null("LeaderboardPanel")
|
||||
if not leaderboard_panel:
|
||||
return
|
||||
|
||||
var sorted_scores = goals_cycle_manager.get_leaderboard() if goals_cycle_manager else []
|
||||
|
||||
# Get player names and update entries
|
||||
for i in range(4): # Max 4 entries
|
||||
var entry = leaderboard_panel.get_node_or_null("Entry" + str(i + 1))
|
||||
if not entry:
|
||||
continue
|
||||
|
||||
if i < sorted_scores.size():
|
||||
var score_data = sorted_scores[i]
|
||||
var player = get_node_or_null(str(score_data.peer_id))
|
||||
var player_name = player.name if player else str(score_data.peer_id)
|
||||
|
||||
var rank_label = entry.get_node_or_null("RankLabel")
|
||||
var name_label = entry.get_node_or_null("NameLabel")
|
||||
var score_label = entry.get_node_or_null("ScoreLabel")
|
||||
|
||||
if rank_label:
|
||||
rank_label.text = _get_ordinal(i + 1)
|
||||
if name_label:
|
||||
name_label.text = player_name
|
||||
if score_label:
|
||||
score_label.text = str(score_data.score)
|
||||
|
||||
entry.visible = true
|
||||
else:
|
||||
entry.visible = false
|
||||
|
||||
func _get_ordinal(n: int) -> String:
|
||||
match n:
|
||||
1: return "1st"
|
||||
2: return "2nd"
|
||||
3: return "3rd"
|
||||
4: return "4th"
|
||||
_: return str(n) + "th"
|
||||
|
||||
Reference in New Issue
Block a user