feat: Implement initial game structure with core logic, various managers, player scene, and project configuration.

This commit is contained in:
2025-12-12 02:16:06 +08:00
parent a04be19af5
commit 96f5754f99
12 changed files with 1161 additions and 138 deletions
+88
View File
@@ -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"