|
|
|
@@ -137,60 +137,52 @@ func update_button_states():
|
|
|
|
|
func set_local_player(player):
|
|
|
|
|
local_player_character = player
|
|
|
|
|
|
|
|
|
|
# Connect to powerup signals
|
|
|
|
|
# Connect to powerup signals with deferred call (manager needs time to initialize)
|
|
|
|
|
_connect_powerup_manager_deferred(player)
|
|
|
|
|
|
|
|
|
|
func _connect_powerup_manager_deferred(player):
|
|
|
|
|
"""Wait for PowerUpManager to be initialized before connecting."""
|
|
|
|
|
await player.get_tree().create_timer(0.3).timeout
|
|
|
|
|
|
|
|
|
|
var powerup_manager = player.get_node_or_null("PowerUpManager")
|
|
|
|
|
if powerup_manager:
|
|
|
|
|
powerup_manager.points_changed.connect(_on_powerup_points_changed)
|
|
|
|
|
if not powerup_manager.points_changed.is_connected(_on_powerup_points_changed):
|
|
|
|
|
powerup_manager.points_changed.connect(_on_powerup_points_changed)
|
|
|
|
|
# Initialize bar with current values
|
|
|
|
|
update_powerup_bar(powerup_manager.get_points(), powerup_manager.get_max_points())
|
|
|
|
|
|
|
|
|
|
# =============================================================================
|
|
|
|
|
# Power-Up Bar UI (Battery Style)
|
|
|
|
|
# =============================================================================
|
|
|
|
|
|
|
|
|
|
var powerup_bar: HBoxContainer
|
|
|
|
|
var powerup_bar: PanelContainer
|
|
|
|
|
var powerup_segments: Array = []
|
|
|
|
|
|
|
|
|
|
func setup_powerup_bar_ui(main_node):
|
|
|
|
|
"""Create battery-style power-up bar with 4 segments."""
|
|
|
|
|
var parent = main_node.get_node_or_null("PlayerboardUI")
|
|
|
|
|
if not parent:
|
|
|
|
|
parent = main_node
|
|
|
|
|
"""Get reference to existing PowerUpBar in scene and cache segment references."""
|
|
|
|
|
powerup_bar = main_node.get_node_or_null("PowerUpBar")
|
|
|
|
|
if not powerup_bar:
|
|
|
|
|
push_warning("PowerUpBar node not found in scene")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# Create container
|
|
|
|
|
powerup_bar = HBoxContainer.new()
|
|
|
|
|
powerup_bar.name = "PowerUpBar"
|
|
|
|
|
powerup_bar.custom_minimum_size = Vector2(200, 30)
|
|
|
|
|
|
|
|
|
|
# Position above playerboard
|
|
|
|
|
powerup_bar.position = Vector2(0, -40)
|
|
|
|
|
|
|
|
|
|
# Create label
|
|
|
|
|
var label = Label.new()
|
|
|
|
|
label.text = "POWER: "
|
|
|
|
|
label.add_theme_font_size_override("font_size", 14)
|
|
|
|
|
powerup_bar.add_child(label)
|
|
|
|
|
|
|
|
|
|
# Create 4 battery segments
|
|
|
|
|
# Get segment references from scene
|
|
|
|
|
powerup_segments.clear()
|
|
|
|
|
for i in range(4):
|
|
|
|
|
var segment = Panel.new()
|
|
|
|
|
segment.custom_minimum_size = Vector2(40, 24)
|
|
|
|
|
segment.name = "Segment" + str(i)
|
|
|
|
|
|
|
|
|
|
# Style the segment
|
|
|
|
|
var style = StyleBoxFlat.new()
|
|
|
|
|
style.bg_color = Color(0.2, 0.2, 0.2, 0.8) # Dark empty
|
|
|
|
|
style.border_color = Color(0.4, 0.8, 0.4, 1.0) # Green border
|
|
|
|
|
style.set_border_width_all(2)
|
|
|
|
|
style.corner_radius_top_left = 4 if i == 0 else 0
|
|
|
|
|
style.corner_radius_bottom_left = 4 if i == 0 else 0
|
|
|
|
|
style.corner_radius_top_right = 4 if i == 3 else 0
|
|
|
|
|
style.corner_radius_bottom_right = 4 if i == 3 else 0
|
|
|
|
|
segment.add_theme_stylebox_override("panel", style)
|
|
|
|
|
|
|
|
|
|
powerup_bar.add_child(segment)
|
|
|
|
|
powerup_segments.append(segment)
|
|
|
|
|
|
|
|
|
|
parent.add_child(powerup_bar)
|
|
|
|
|
var hbox = powerup_bar.get_node_or_null("HBox")
|
|
|
|
|
if hbox:
|
|
|
|
|
for i in range(4):
|
|
|
|
|
var segment = hbox.get_node_or_null("Segment" + str(i))
|
|
|
|
|
if segment:
|
|
|
|
|
# Apply initial empty style
|
|
|
|
|
var style = StyleBoxFlat.new()
|
|
|
|
|
style.bg_color = Color(0.15, 0.15, 0.15, 1.0)
|
|
|
|
|
style.border_color = Color(0.3, 0.7, 0.3, 1.0)
|
|
|
|
|
style.set_border_width_all(2)
|
|
|
|
|
style.corner_radius_top_left = 4 if i == 0 else 0
|
|
|
|
|
style.corner_radius_bottom_left = 4 if i == 0 else 0
|
|
|
|
|
style.corner_radius_top_right = 4 if i == 3 else 0
|
|
|
|
|
style.corner_radius_bottom_right = 4 if i == 3 else 0
|
|
|
|
|
segment.add_theme_stylebox_override("panel", style)
|
|
|
|
|
powerup_segments.append(segment)
|
|
|
|
|
|
|
|
|
|
func update_powerup_bar(current_points: int, max_points: int):
|
|
|
|
|
"""Update battery segments based on current power-up points."""
|
|
|
|
@@ -219,75 +211,22 @@ func _on_powerup_points_changed(current: int, max_points: int):
|
|
|
|
|
var leaderboard_panel: PanelContainer
|
|
|
|
|
|
|
|
|
|
func setup_leaderboard_ui(main_node):
|
|
|
|
|
"""Create leaderboard panel on right side of screen."""
|
|
|
|
|
leaderboard_panel = PanelContainer.new()
|
|
|
|
|
leaderboard_panel.name = "LeaderboardPanel"
|
|
|
|
|
leaderboard_panel.custom_minimum_size = Vector2(180, 180)
|
|
|
|
|
"""Get reference to existing LeaderboardPanel in scene."""
|
|
|
|
|
leaderboard_panel = main_node.get_node_or_null("LeaderboardPanel")
|
|
|
|
|
if not leaderboard_panel:
|
|
|
|
|
push_warning("LeaderboardPanel node not found in scene")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# Position on right side
|
|
|
|
|
leaderboard_panel.set_anchors_preset(Control.PRESET_TOP_RIGHT)
|
|
|
|
|
leaderboard_panel.position = Vector2(-200, 100)
|
|
|
|
|
|
|
|
|
|
# Style the panel
|
|
|
|
|
# Apply styling to the panel
|
|
|
|
|
var style = StyleBoxFlat.new()
|
|
|
|
|
style.bg_color = Color(0.1, 0.1, 0.1, 0.85)
|
|
|
|
|
style.border_color = Color(0.8, 0.7, 0.2, 1.0) # Gold border
|
|
|
|
|
style.bg_color = Color(0.08, 0.08, 0.12, 0.92)
|
|
|
|
|
style.border_color = Color(0.85, 0.75, 0.25, 1.0) # Gold border
|
|
|
|
|
style.set_border_width_all(2)
|
|
|
|
|
style.corner_radius_top_left = 8
|
|
|
|
|
style.corner_radius_top_right = 8
|
|
|
|
|
style.corner_radius_bottom_left = 8
|
|
|
|
|
style.corner_radius_bottom_right = 8
|
|
|
|
|
leaderboard_panel.add_theme_stylebox_override("panel", style)
|
|
|
|
|
|
|
|
|
|
var vbox = VBoxContainer.new()
|
|
|
|
|
vbox.name = "VBox"
|
|
|
|
|
|
|
|
|
|
# Title
|
|
|
|
|
var title = Label.new()
|
|
|
|
|
title.text = "LEADERBOARD"
|
|
|
|
|
title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
|
|
|
title.add_theme_font_size_override("font_size", 16)
|
|
|
|
|
title.add_theme_color_override("font_color", Color(0.9, 0.8, 0.2))
|
|
|
|
|
vbox.add_child(title)
|
|
|
|
|
|
|
|
|
|
# Separator
|
|
|
|
|
var sep = HSeparator.new()
|
|
|
|
|
vbox.add_child(sep)
|
|
|
|
|
|
|
|
|
|
# Create 4 player entries
|
|
|
|
|
for i in range(4):
|
|
|
|
|
var entry = HBoxContainer.new()
|
|
|
|
|
entry.name = "Entry" + str(i + 1)
|
|
|
|
|
entry.visible = false
|
|
|
|
|
|
|
|
|
|
var rank_label = Label.new()
|
|
|
|
|
rank_label.name = "RankLabel"
|
|
|
|
|
rank_label.custom_minimum_size = Vector2(40, 0)
|
|
|
|
|
rank_label.text = _get_rank_text(i + 1)
|
|
|
|
|
rank_label.add_theme_font_size_override("font_size", 14)
|
|
|
|
|
entry.add_child(rank_label)
|
|
|
|
|
|
|
|
|
|
var name_label = Label.new()
|
|
|
|
|
name_label.name = "NameLabel"
|
|
|
|
|
name_label.custom_minimum_size = Vector2(80, 0)
|
|
|
|
|
name_label.clip_text = true
|
|
|
|
|
name_label.text = "---"
|
|
|
|
|
name_label.add_theme_font_size_override("font_size", 14)
|
|
|
|
|
entry.add_child(name_label)
|
|
|
|
|
|
|
|
|
|
var score_label = Label.new()
|
|
|
|
|
score_label.name = "ScoreLabel"
|
|
|
|
|
score_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
|
|
|
|
|
score_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
|
|
|
|
score_label.text = "0"
|
|
|
|
|
score_label.add_theme_font_size_override("font_size", 14)
|
|
|
|
|
score_label.add_theme_color_override("font_color", Color(0.8, 1.0, 0.8))
|
|
|
|
|
entry.add_child(score_label)
|
|
|
|
|
|
|
|
|
|
vbox.add_child(entry)
|
|
|
|
|
|
|
|
|
|
leaderboard_panel.add_child(vbox)
|
|
|
|
|
main_node.add_child(leaderboard_panel)
|
|
|
|
|
|
|
|
|
|
func _get_rank_text(rank: int) -> String:
|
|
|
|
|
match rank:
|
|
|
|
@@ -302,29 +241,59 @@ func _get_rank_text(rank: int) -> String:
|
|
|
|
|
# =============================================================================
|
|
|
|
|
|
|
|
|
|
func setup_timer_labels(main_node):
|
|
|
|
|
"""Add timer labels to each player goals panel."""
|
|
|
|
|
var all_player_goals = main_node.get_node_or_null("AllPlayerGoals")
|
|
|
|
|
if not all_player_goals:
|
|
|
|
|
"""Apply styling to standalone GoalsTimer in scene."""
|
|
|
|
|
var goals_timer = main_node.get_node_or_null("GoalsTimer")
|
|
|
|
|
if not goals_timer:
|
|
|
|
|
push_warning("GoalsTimer node not found in scene")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
for i in range(all_player_goals.get_child_count()):
|
|
|
|
|
var panel = all_player_goals.get_child(i)
|
|
|
|
|
|
|
|
|
|
# Skip if timer already exists
|
|
|
|
|
if panel.get_node_or_null("TimerLabel"):
|
|
|
|
|
# Apply dark background style
|
|
|
|
|
var style = StyleBoxFlat.new()
|
|
|
|
|
style.bg_color = Color(0.1, 0.1, 0.15, 0.9)
|
|
|
|
|
style.border_color = Color(1.0, 0.85, 0.2, 1.0) # Gold border
|
|
|
|
|
style.set_border_width_all(2)
|
|
|
|
|
style.corner_radius_top_left = 8
|
|
|
|
|
style.corner_radius_top_right = 8
|
|
|
|
|
style.corner_radius_bottom_left = 8
|
|
|
|
|
style.corner_radius_bottom_right = 8
|
|
|
|
|
goals_timer.add_theme_stylebox_override("panel", style)
|
|
|
|
|
|
|
|
|
|
# Style the timer label
|
|
|
|
|
var timer_label = goals_timer.get_node_or_null("VBox/TimerLabel")
|
|
|
|
|
if timer_label:
|
|
|
|
|
timer_label.add_theme_color_override("font_color", Color(1.0, 0.85, 0.2))
|
|
|
|
|
|
|
|
|
|
var suffix_label = goals_timer.get_node_or_null("VBox/SuffixLabel")
|
|
|
|
|
if suffix_label:
|
|
|
|
|
suffix_label.add_theme_color_override("font_color", Color(0.7, 0.7, 0.7))
|
|
|
|
|
|
|
|
|
|
# Method to update leaderboard with all players in match
|
|
|
|
|
func initialize_leaderboard_with_players(players: Array):
|
|
|
|
|
"""Initialize leaderboard showing all players with score 0."""
|
|
|
|
|
if not leaderboard_panel:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
var vbox = leaderboard_panel.get_node_or_null("MarginContainer/VBox")
|
|
|
|
|
if not vbox:
|
|
|
|
|
vbox = leaderboard_panel.get_node_or_null("VBox")
|
|
|
|
|
if not vbox:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
for i in range(4):
|
|
|
|
|
var entry = vbox.get_node_or_null("Entry" + str(i + 1))
|
|
|
|
|
if not entry:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
var timer_label = Label.new()
|
|
|
|
|
timer_label.name = "TimerLabel"
|
|
|
|
|
timer_label.text = "01:00"
|
|
|
|
|
timer_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
|
|
|
timer_label.add_theme_font_size_override("font_size", 18)
|
|
|
|
|
timer_label.add_theme_color_override("font_color", Color(1.0, 0.9, 0.3))
|
|
|
|
|
|
|
|
|
|
# Add at the top of the panel
|
|
|
|
|
var margin = panel.get_node_or_null("MarginContainer")
|
|
|
|
|
if margin:
|
|
|
|
|
margin.add_child(timer_label)
|
|
|
|
|
margin.move_child(timer_label, 0)
|
|
|
|
|
if i < players.size():
|
|
|
|
|
var player = players[i]
|
|
|
|
|
var name_label = entry.get_node_or_null("NameLabel")
|
|
|
|
|
var score_label = entry.get_node_or_null("ScoreLabel")
|
|
|
|
|
|
|
|
|
|
if name_label:
|
|
|
|
|
name_label.text = str(player.name) if player else "Player " + str(i + 1)
|
|
|
|
|
if score_label:
|
|
|
|
|
score_label.text = str(player.score) if player and player.get("score") else "0"
|
|
|
|
|
|
|
|
|
|
entry.visible = true
|
|
|
|
|
else:
|
|
|
|
|
panel.add_child(timer_label)
|
|
|
|
|
entry.visible = false
|
|
|
|
|