From 95c3cef1becf85e1252240866a0b59698dfa73b6 Mon Sep 17 00:00:00 2001 From: Joshua Higgins Date: Sun, 7 Dec 2025 01:24:13 -0500 Subject: [PATCH] feat: theming pass, reworked connection flow... - bracket view theming (pending rework) - some light refactoring - TOURNAMENT:CANCEL command (pending server side implementation) - logic for waiting for last moves in games to wait for chip to drop - transition back to main menu on disconnects, disconnect tolerance --- assets/sprites/rpi.png | Bin 0 -> 11717 bytes assets/sprites/rpi.png.import | 40 ++++++++++++ assets/theme.tres | 6 ++ scenes/board_screen.tscn | 4 +- scenes/bracket_view.tscn | 33 +++++++++- scenes/game.tscn | 25 +++++++- scenes/main_menu.tscn | 93 ++++++++++++++++++++++++++- scripts/AdminControls.cs | 70 +++++---------------- scripts/BoardScreen.cs | 49 ++++++++------- scripts/BracketScene.cs | 39 +++++++++++- scripts/ConnectButtonUI.cs | 22 +++---- scripts/Connection.cs | 114 ++++++++++++++++++---------------- 12 files changed, 344 insertions(+), 151 deletions(-) create mode 100644 assets/sprites/rpi.png create mode 100644 assets/sprites/rpi.png.import create mode 100644 assets/theme.tres diff --git a/assets/sprites/rpi.png b/assets/sprites/rpi.png new file mode 100644 index 0000000000000000000000000000000000000000..a0cc0aa9b8e8326834a8c8a1586a5a050330721e GIT binary patch literal 11717 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 Mt19zK$~gG{0L8CECjbBd literal 0 HcmV?d00001 diff --git a/assets/sprites/rpi.png.import b/assets/sprites/rpi.png.import new file mode 100644 index 0000000..8e8f67c --- /dev/null +++ b/assets/sprites/rpi.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uritd4ygetrk" +path="res://.godot/imported/rpi.png-0f0faa9ccfa1d0b656d9c381bb4a7a6d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/rpi.png" +dest_files=["res://.godot/imported/rpi.png-0f0faa9ccfa1d0b656d9c381bb4a7a6d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/theme.tres b/assets/theme.tres new file mode 100644 index 0000000..ac89a53 --- /dev/null +++ b/assets/theme.tres @@ -0,0 +1,6 @@ +[gd_resource type="Theme" load_steps=2 format=3 uid="uid://bbgxacei1vwba"] + +[ext_resource type="FontFile" uid="uid://c3jmev24lo6ci" path="res://assets/fonts/PixelOperator8.ttf" id="1_5x3i2"] + +[resource] +default_font = ExtResource("1_5x3i2") diff --git a/scenes/board_screen.tscn b/scenes/board_screen.tscn index ed6e0f9..da3faa5 100644 --- a/scenes/board_screen.tscn +++ b/scenes/board_screen.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=16 format=3 uid="uid://m542qwlp7hl7"] +[gd_scene load_steps=17 format=3 uid="uid://m542qwlp7hl7"] [ext_resource type="Script" uid="uid://dg5jt0o0r0v3r" path="res://scripts/BoardScreen.cs" id="1_b3w8x"] [ext_resource type="AudioStream" uid="uid://crxjuk1vyq331" path="res://assets/sfx/game_end.ogg" id="2_kseed"] [ext_resource type="Texture2D" uid="uid://dlx02qat7j6lf" path="res://assets/sprites/AssetTileset.png" id="3_1tlhv"] +[ext_resource type="Theme" uid="uid://bbgxacei1vwba" path="res://assets/theme.tres" id="3_3louw"] [ext_resource type="FontFile" uid="uid://c3jmev24lo6ci" path="res://assets/fonts/PixelOperator8.ttf" id="3_rjcmr"] [ext_resource type="Texture2D" uid="uid://ckmfi0cjgxgyk" path="res://assets/sprites/RedChip.png" id="4_1hrcj"] [ext_resource type="Texture2D" uid="uid://qy30emdgrk7o" path="res://assets/sprites/YellowChip.png" id="5_i2o8i"] @@ -36,6 +37,7 @@ region = Rect2(112, 32, 16, 16) [node name="BoardScreen" type="Node2D"] script = ExtResource("1_b3w8x") endingSfx = ExtResource("2_kseed") +theme = ExtResource("3_3louw") [node name="Floor Collider" type="StaticBody2D" parent="."] position = Vector2(0, 200) diff --git a/scenes/bracket_view.tscn b/scenes/bracket_view.tscn index 305c1b4..60368fc 100644 --- a/scenes/bracket_view.tscn +++ b/scenes/bracket_view.tscn @@ -1,10 +1,22 @@ -[gd_scene load_steps=5 format=3 uid="uid://rl33x81cxlh0"] +[gd_scene load_steps=8 format=3 uid="uid://rl33x81cxlh0"] +[ext_resource type="Theme" uid="uid://bbgxacei1vwba" path="res://assets/theme.tres" id="1_as653"] [ext_resource type="Script" uid="uid://dm25u0a2lqk2x" path="res://scripts/BracketScene.cs" id="1_dvj3m"] [ext_resource type="Texture2D" uid="uid://da13ksuf4vkqe" path="res://assets/sprites/observe.png" id="2_mbqc8"] [ext_resource type="Texture2D" uid="uid://stk7umv2ppss" path="res://assets/sprites/cancel.png" id="3_as653"] [ext_resource type="Script" uid="uid://1y72woiynf31" path="res://scripts/AdminControls.cs" id="4_mbqc8"] +[sub_resource type="Gradient" id="Gradient_wu84c"] +colors = PackedColorArray(0, 0.07058824, 0.101960786, 1, 0.39215687, 0.39215687, 0.39215687, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_as653"] +gradient = SubResource("Gradient_wu84c") +width = 1024 +height = 1024 +fill_from = Vector2(0.5, 1) +fill_to = Vector2(0.5, 0) +metadata/_snap_enabled = true + [node name="BracketView" type="Control" node_paths=PackedStringArray("Players", "Matches")] layout_mode = 3 anchors_preset = 15 @@ -12,12 +24,24 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +theme = ExtResource("1_as653") script = ExtResource("1_dvj3m") Players = NodePath("HBoxContainer/PlayerList") Matches = NodePath("HBoxContainer/MatchList") WatchButton = ExtResource("2_mbqc8") TerminateKickButton = ExtResource("3_as653") +[node name="Background" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -152.0 +offset_bottom = 152.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("GradientTexture2D_as653") + [node name="ColorRect" type="ColorRect" parent="."] custom_minimum_size = Vector2(0, 36) layout_mode = 1 @@ -26,7 +50,7 @@ anchor_right = 1.0 grow_horizontal = 2 color = Color(0.13319641, 0.13319641, 0.13319638, 1) -[node name="AdminControls" type="HBoxContainer" parent="ColorRect" node_paths=PackedStringArray("BecomeAdmin", "StartTournament", "Label", "Timeout")] +[node name="AdminControls" type="HBoxContainer" parent="ColorRect" node_paths=PackedStringArray("BecomeAdmin", "StartTournament", "CancelTournament", "Label", "Timeout")] custom_minimum_size = Vector2(0, 36) layout_mode = 1 anchors_preset = 10 @@ -36,6 +60,7 @@ grow_horizontal = 2 script = ExtResource("4_mbqc8") BecomeAdmin = NodePath("BecomeAdmin") StartTournament = NodePath("StartTournament") +CancelTournament = NodePath("CancelTournament") Label = NodePath("Label") Timeout = NodePath("HSlider") @@ -47,6 +72,10 @@ text = "Become Admin" layout_mode = 2 text = "Start Tournament" +[node name="CancelTournament" type="Button" parent="ColorRect/AdminControls"] +layout_mode = 2 +text = "Cancel Tournament" + [node name="Label" type="Label" parent="ColorRect/AdminControls"] layout_mode = 2 text = "Wait To Move: 5.0s " diff --git a/scenes/game.tscn b/scenes/game.tscn index 51279da..0b1f28f 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1,10 +1,33 @@ -[gd_scene load_steps=3 format=3 uid="uid://cr8fi0e4r88s8"] +[gd_scene load_steps=5 format=3 uid="uid://cr8fi0e4r88s8"] [ext_resource type="PackedScene" uid="uid://cct663hb47yka" path="res://scenes/create_join_room.tscn" id="1_yqjtg"] [ext_resource type="PackedScene" uid="uid://m542qwlp7hl7" path="res://scenes/board_screen.tscn" id="2_lnu2h"] +[sub_resource type="Gradient" id="Gradient_wu84c"] +colors = PackedColorArray(0, 0.07058824, 0.101960786, 1, 0.39215687, 0.39215687, 0.39215687, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_yqjtg"] +gradient = SubResource("Gradient_wu84c") +width = 1024 +height = 1024 +fill_from = Vector2(0.5, 1) +fill_to = Vector2(0.5, 0) +metadata/_snap_enabled = true + [node name="Game" type="Node2D"] +[node name="Background" type="TextureRect" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -659.0 +offset_top = -558.0 +offset_right = 619.0 +offset_bottom = 466.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("GradientTexture2D_yqjtg") + [node name="GameManager" type="Node" parent="."] [node name="Camera2D" type="Camera2D" parent="."] diff --git a/scenes/main_menu.tscn b/scenes/main_menu.tscn index 95ed999..74986d0 100644 --- a/scenes/main_menu.tscn +++ b/scenes/main_menu.tscn @@ -1,7 +1,20 @@ -[gd_scene load_steps=3 format=3 uid="uid://dcx5nvs0pa7me"] +[gd_scene load_steps=7 format=3 uid="uid://dcx5nvs0pa7me"] [ext_resource type="Script" uid="uid://bk22f71oximjk" path="res://scripts/AddressUI.cs" id="1_l6cm7"] +[ext_resource type="Theme" uid="uid://bbgxacei1vwba" path="res://assets/theme.tres" id="1_wu84c"] [ext_resource type="Script" uid="uid://cpjbiqn26khck" path="res://scripts/ConnectButtonUI.cs" id="2_ekxnf"] +[ext_resource type="Texture2D" uid="uid://uritd4ygetrk" path="res://assets/sprites/rpi.png" id="3_bqqt6"] + +[sub_resource type="Gradient" id="Gradient_wu84c"] +colors = PackedColorArray(0, 0.07058824, 0.101960786, 1, 0.39215687, 0.39215687, 0.39215687, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_yqjtg"] +gradient = SubResource("Gradient_wu84c") +width = 1024 +height = 1024 +fill_from = Vector2(0.5, 1) +fill_to = Vector2(0.5, 0) +metadata/_snap_enabled = true [node name="Control" type="Control"] layout_mode = 3 @@ -11,6 +24,63 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +[node name="Background" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("GradientTexture2D_yqjtg") + +[node name="RPI Minds and Machines" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -193.5 +offset_top = 128.0 +offset_right = 193.5 +offset_bottom = 152.0 +grow_horizontal = 2 +theme = ExtResource("1_wu84c") +theme_type_variation = &"HeaderMedium" +text = "RPI Minds & Machines" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Connect" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -100.0 +offset_top = 200.0 +offset_right = 68.00122 +offset_bottom = 229.0 +grow_horizontal = 2 +theme = ExtResource("1_wu84c") +theme_type_variation = &"HeaderLarge" +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 16 +text = "Connect" + +[node name="4" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = 78.0 +offset_top = 200.0 +offset_right = 118.00116 +offset_bottom = 229.0 +grow_horizontal = 2 +theme = ExtResource("1_wu84c") +theme_type_variation = &"HeaderLarge" +theme_override_colors/font_color = Color(1, 0, 0, 1) +theme_override_constants/outline_size = 16 +text = "4" + [node name="Address" type="TextEdit" parent="."] layout_mode = 1 anchors_preset = 8 @@ -24,10 +94,13 @@ offset_right = 250.0 offset_bottom = 20.0 grow_horizontal = 2 grow_vertical = 2 +theme = ExtResource("1_wu84c") placeholder_text = "Server Address" +emoji_menu_enabled = false +scroll_smooth = true script = ExtResource("1_l6cm7") -[node name="Button" type="Button" parent="." node_paths=PackedStringArray("AddressUi", "ErrorLabel")] +[node name="Button" type="Button" parent="." node_paths=PackedStringArray("AddressField", "ErrorLabel")] layout_mode = 1 anchors_preset = 8 anchor_left = 0.5 @@ -40,9 +113,10 @@ offset_right = 250.0 offset_bottom = 67.25 grow_horizontal = 2 grow_vertical = 2 +theme = ExtResource("1_wu84c") text = "Connect" script = ExtResource("2_ekxnf") -AddressUi = NodePath("../Address") +AddressField = NodePath("../Address") ErrorLabel = NodePath("../Label") [node name="Label" type="Label" parent="."] @@ -58,4 +132,17 @@ offset_right = 68.5 offset_bottom = 98.149994 grow_horizontal = 2 grow_vertical = 2 +theme = ExtResource("1_wu84c") theme_override_colors/font_color = Color(1, 0, 0, 1) + +[node name="TextureRect" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 5.0 +offset_top = -69.0 +offset_right = 69.0 +offset_bottom = -5.0 +grow_vertical = 0 +texture = ExtResource("3_bqqt6") diff --git a/scripts/AdminControls.cs b/scripts/AdminControls.cs index 7fbd74f..db1129c 100644 --- a/scripts/AdminControls.cs +++ b/scripts/AdminControls.cs @@ -1,29 +1,31 @@ using Godot; -using System; -using System.Collections.Generic; public partial class AdminControls : HBoxContainer { [Export] public Button BecomeAdmin; [Export] public Button StartTournament; + [Export] public Button CancelTournament; [Export] public Label Label; [Export] public Slider Timeout; public override void _Ready() { Connection.Instance.OnBecomeAdmin += OnBecomeAdmin; - Connection.Instance.OnTournamentEnd += OnEndTournament; + Connection.Instance.OnTournamentEnd += _ => StartTournament.Show(); + Connection.Instance.OnStartTournamentAck += () => StartTournament.Hide(); - StartTournament.Pressed += StartTournamentCommand; - if (!Connection.Instance.IsAdmin || Connection.Instance.ActiveTournament) - { - StartTournament.Hide(); - } - + StartTournament.Pressed += () => Connection.Instance.StartTournament(); + CancelTournament.Pressed += () => Connection.Instance.CancelTournament(); if (!Connection.Instance.IsAdmin) { + StartTournament.Hide(); + CancelTournament.Hide(); Label.Hide(); Timeout.Hide(); + } + else if (Connection.Instance.ActiveTournament) + { + StartTournament.Hide(); } Timeout.Value = Connection.Instance.CurrentWaitTimeout; @@ -51,23 +53,12 @@ public partial class AdminControls : HBoxContainer public override void _ExitTree() { Connection.Instance.OnBecomeAdmin -= OnBecomeAdmin; - Connection.Instance.OnTournamentEnd -= OnEndTournament; - } - - private void StartTournamentCommand() - { - Connection.Instance.StartTournament(); - } - - private void OnEndTournament(List<(string, int)> playerScoreboard) - { - StartTournament.Show(); - ShowTournamentScoreboard(playerScoreboard); } private void ShowAuthPopup() { var authWindow = new Window(); + authWindow.Theme = GD.Load("res://assets/theme.tres"); authWindow.AlwaysOnTop = true; authWindow.MaximizeDisabled = true; authWindow.Unresizable = true; @@ -106,39 +97,6 @@ public partial class AdminControls : HBoxContainer GetTree().Root.AddChild(authWindow); } - private void ShowTournamentScoreboard(List<(string, int)> playerScoreboard) - { - var scoreboardWindow = new Window(); - scoreboardWindow.AlwaysOnTop = true; - scoreboardWindow.MaximizeDisabled = true; - scoreboardWindow.Unresizable = true; - scoreboardWindow.InitialPosition = Window.WindowInitialPosition.CenterMainWindowScreen; - scoreboardWindow.Size = new Vector2I(256, 512); - scoreboardWindow.CloseRequested += () => - { - GetTree().Root.RemoveChild(scoreboardWindow); - }; - - var tree = new Tree(); - tree.HideRoot = true; - tree.Columns = 2; - tree.ColumnTitlesVisible = true; - tree.SetColumnTitle(0, "Player"); - tree.SetColumnTitle(1, "Score"); - var root = tree.CreateItem(); - - foreach ((string, int) entry in playerScoreboard) - { - var item = tree.CreateItem(root); - item.SetText(0, entry.Item1); - item.SetText(1, entry.Item2.ToString()); - } - - scoreboardWindow.AddChild(tree); - - GetTree().Root.AddChild(scoreboardWindow); - } - private void OnBecomeAdmin() { BecomeAdmin.Hide(); @@ -146,6 +104,10 @@ public partial class AdminControls : HBoxContainer { StartTournament.Show(); } + else + { + CancelTournament.Show(); + } Label.Show(); Timeout.Show(); } diff --git a/scripts/BoardScreen.cs b/scripts/BoardScreen.cs index db8e3c6..2b1db82 100644 --- a/scripts/BoardScreen.cs +++ b/scripts/BoardScreen.cs @@ -1,5 +1,4 @@ using Godot; -using System; using System.Collections.Generic; using System.Linq; @@ -7,6 +6,7 @@ public partial class BoardScreen : Node2D { [Export] private AudioStream endingSfx; + [Export] private Theme theme; private const string RED_CHIP_PATH = "res://scenes/red_chip.tscn"; private const string YELLOW_CHIP_PATH = "res://scenes/yellow_chip.tscn"; @@ -30,6 +30,10 @@ public partial class BoardScreen : Node2D private RigidBody2D[,] chips = new RigidBody2D[6, 7]; // 6 rows 7 cols | 0, 0 is top left + private bool _lastMove = false; + private float _lastMoveTimer = 2.5f; + private string _winner = ""; + // Called when the node enters the scene tree for the first time. public override void _Ready() { // Node initialization @@ -62,11 +66,12 @@ public partial class BoardScreen : Node2D player2Card.GetNode