diff --git a/Game/scenes/HUD.tscn b/Game/scenes/HUD.tscn index d1031eae..6228ac29 100644 --- a/Game/scenes/HUD.tscn +++ b/Game/scenes/HUD.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://c8kak2l3m4n5"] +[gd_scene load_steps=9 format=3 uid="uid://c8kak2l3m4n5"] [ext_resource type="Script" uid="uid://du7y176h5aaq4" path="res://scripts/HUDController.gd" id="1_hud_controller"] [ext_resource type="Script" path="res://scripts/hud_attitude_indicator.gd" id="2_adi"] @@ -22,6 +22,22 @@ content_margin_top = 8.0 content_margin_right = 20.0 content_margin_bottom = 8.0 +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_result"] +bg_color = Color(0.05, 0.06, 0.09, 0.85) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(1, 1, 1, 0.2) +corner_radius_top_left = 20 +corner_radius_top_right = 20 +corner_radius_bottom_right = 20 +corner_radius_bottom_left = 20 +content_margin_left = 48.0 +content_margin_top = 32.0 +content_margin_right = 48.0 +content_margin_bottom = 32.0 + [node name="HUD" type="CanvasLayer"] process_mode = 3 script = ExtResource("1_hud_controller") @@ -134,19 +150,23 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="VBox" type="VBoxContainer" parent="Control/ResultOverlay/Center"] +[node name="ResultPanel" type="PanelContainer" parent="Control/ResultOverlay/Center"] +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_result") + +[node name="VBox" type="VBoxContainer" parent="Control/ResultOverlay/Center/ResultPanel"] layout_mode = 2 theme_override_constants/separation = 16 -[node name="ResultLabel" type="Label" parent="Control/ResultOverlay/Center/VBox"] +[node name="ResultLabel" type="Label" parent="Control/ResultOverlay/Center/ResultPanel/VBox"] layout_mode = 2 -theme_override_font_sizes/font_size = 56 +theme_override_font_sizes/font_size = 64 text = "Draw" horizontal_alignment = 1 -[node name="FinalScoreLabel" type="Label" parent="Control/ResultOverlay/Center/VBox"] +[node name="FinalScoreLabel" type="Label" parent="Control/ResultOverlay/Center/ResultPanel/VBox"] layout_mode = 2 -theme_override_font_sizes/font_size = 36 +theme_override_font_sizes/font_size = 44 text = "0 - 0" horizontal_alignment = 1 diff --git a/Game/scripts/HUDController.gd b/Game/scripts/HUDController.gd index 54910c82..6310244f 100644 --- a/Game/scripts/HUDController.gd +++ b/Game/scripts/HUDController.gd @@ -13,8 +13,9 @@ class_name HUDController @onready var team1_name_label = get_node_or_null("Control/ScoreboardPanel/ScoreRow/Team1Name") @onready var kickoff_label = get_node_or_null("Control/KickoffLabel") @onready var result_overlay = get_node_or_null("Control/ResultOverlay") -@onready var result_label = get_node_or_null("Control/ResultOverlay/Center/VBox/ResultLabel") -@onready var final_score_label = get_node_or_null("Control/ResultOverlay/Center/VBox/FinalScoreLabel") +@onready var result_panel = get_node_or_null("Control/ResultOverlay/Center/ResultPanel") +@onready var result_label = get_node_or_null("Control/ResultOverlay/Center/ResultPanel/VBox/ResultLabel") +@onready var final_score_label = get_node_or_null("Control/ResultOverlay/Center/ResultPanel/VBox/FinalScoreLabel") @onready var heading_tape: HudHeadingTape = get_node_or_null("Control/Instruments/HeadingTape") @onready var attitude_indicator: HudAttitudeIndicator = get_node_or_null("Control/Instruments/Cluster/Dials/AttitudeIndicator") @@ -166,8 +167,35 @@ func _on_match_ended(winning_team: int, score: Dictionary): if winning_team < 0: result_label.text = "Draw" result_label.remove_theme_color_override("font_color") + _set_result_panel_accent(Color(1, 1, 1, 0.2)) else: result_label.text = "%s team wins!" % TEAM_NAMES[winning_team] result_label.add_theme_color_override("font_color", TEAM_COLORS[winning_team]) + _set_result_panel_accent(TEAM_COLORS[winning_team]) final_score_label.text = "%d - %d" % [score.get(0, 0), score.get(1, 0)] result_overlay.visible = true + _animate_result_panel_in() + +# Tints the result panel's border to match the winning team (neutral for a draw). +func _set_result_panel_accent(color: Color) -> void: + if not result_panel or not is_instance_valid(result_panel): + return + var style: StyleBoxFlat = result_panel.get_theme_stylebox("panel").duplicate() + style.border_color = color + result_panel.add_theme_stylebox_override("panel", style) + +# Quick scale/fade pop so the results screen doesn't just snap into view. +func _animate_result_panel_in() -> void: + if not result_panel or not is_instance_valid(result_panel): + return + result_panel.scale = Vector2(0.85, 0.85) + result_panel.modulate.a = 0.0 + # ResultOverlay was hidden since scene start, so ResultPanel's + # container-computed size isn't valid until the next layout pass. + await get_tree().process_frame + if not is_instance_valid(result_panel): + return + result_panel.pivot_offset = result_panel.size / 2.0 + var tween := create_tween().set_parallel(true) + tween.tween_property(result_panel, "scale", Vector2.ONE, 0.25).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT) + tween.tween_property(result_panel, "modulate:a", 1.0, 0.2)