From 7a5f9d66915b4fc3d25a41ce48421c14a9bea8b4 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 29 Oct 2025 13:41:48 +0100 Subject: [PATCH 1/4] feat: started working on the flatscreen UI --- .../scenes/flatscreen_root.tscn | 11 ++++++++++ vr-project/scenes/game_scene.tscn | 20 ------------------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/flatscreen-project/scenes/flatscreen_root.tscn b/flatscreen-project/scenes/flatscreen_root.tscn index 1f37582c..a00c5e5e 100644 --- a/flatscreen-project/scenes/flatscreen_root.tscn +++ b/flatscreen-project/scenes/flatscreen_root.tscn @@ -1,3 +1,14 @@ [gd_scene format=3 uid="uid://dosb4sb7pvss4"] [node name="ServerNode" type="ServerNode"] + +[node name="AspectRatioContainer" type="AspectRatioContainer" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +ratio = 1.7778 + +[node name="PanelContainer" type="PanelContainer" parent="AspectRatioContainer"] +layout_mode = 2 diff --git a/vr-project/scenes/game_scene.tscn b/vr-project/scenes/game_scene.tscn index ff7e11ec..d020967d 100644 --- a/vr-project/scenes/game_scene.tscn +++ b/vr-project/scenes/game_scene.tscn @@ -36,16 +36,6 @@ glow_enabled = true [node name="Root" type="Node3D"] [node name="VROrigin" parent="." instance=ExtResource("2_onqr8")] -_import_path = NodePath("") -unique_name_in_owner = false -process_mode = 0 -process_priority = 0 -process_physics_priority = 0 -process_thread_group = 0 -physics_interpolation_mode = 0 -auto_translate_mode = 0 -editor_description = "" -script = null [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_bw6k5") @@ -66,17 +56,7 @@ shadow_blur = 2.834 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.27989578, 0, 1.4924412) [node name="ClueMarker" type="ClueMarker" parent="."] -_import_path = NodePath("") -unique_name_in_owner = false -process_mode = 0 -process_priority = 0 -process_physics_priority = 0 -process_thread_group = 0 -physics_interpolation_mode = 0 -auto_translate_mode = 0 -editor_description = "" clue_id = 0 -script = null [node name="Stapler" parent="." instance=ExtResource("3_ycayy")] transform = Transform3D(-1.8868132, 0, -1.8585076, 0, 2.6484175, 0, 1.8585076, 0, -1.8868132, -1.2748423, 0.9004388, 2.876501) From cfb901ec46e1d843b13b921b4227359c545a8520 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 29 Oct 2025 13:42:01 +0100 Subject: [PATCH 2/4] feat: ServerNode no longer opens server on enter() --- modules/you_done_it/server_node.cpp | 7 ++++++- modules/you_done_it/server_node.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/you_done_it/server_node.cpp b/modules/you_done_it/server_node.cpp index 1db8473f..97c9b7f8 100644 --- a/modules/you_done_it/server_node.cpp +++ b/modules/you_done_it/server_node.cpp @@ -11,6 +11,8 @@ void ServerNode::_bind_methods() { ADD_SIGNAL(MethodInfo(sig_clue_revealed, PropertyInfo(Variant::INT, "id"))); ADD_SIGNAL(MethodInfo(sig_connection_established)); ADD_SIGNAL(MethodInfo(sig_connection_lost)); + + ClassDB::bind_method(D_METHOD("open"), &self_type::open); } void ServerNode::enter_tree() { @@ -19,7 +21,6 @@ void ServerNode::enter_tree() { abort(); } else { singleton_instance = this; - ydi::server::open(); } } @@ -67,3 +68,7 @@ void ServerNode::_notification(int what) { ServerNode *ServerNode::get_singleton() { return singleton_instance; } + +void ServerNode::open() { + ydi::server::open(); +} diff --git a/modules/you_done_it/server_node.h b/modules/you_done_it/server_node.h index 8f1b31e9..ab6d8a91 100644 --- a/modules/you_done_it/server_node.h +++ b/modules/you_done_it/server_node.h @@ -15,6 +15,7 @@ protected: public: static ServerNode *get_singleton(); + void open(); public: static String const sig_clue_revealed; From 6add0813d15133f68495c3bca27c23a67f4c22c8 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 29 Oct 2025 17:19:18 +0100 Subject: [PATCH 3/4] feat: improved ServerNode scriptability --- modules/you_done_it/server_node.cpp | 28 +++++++++++++++++++++------- modules/you_done_it/server_node.h | 4 +++- modules/you_done_it/ydi_server.cpp | 25 ++++++++++++++++--------- modules/you_done_it/ydi_server.h | 3 ++- 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/modules/you_done_it/server_node.cpp b/modules/you_done_it/server_node.cpp index 97c9b7f8..dde038ef 100644 --- a/modules/you_done_it/server_node.cpp +++ b/modules/you_done_it/server_node.cpp @@ -13,6 +13,9 @@ void ServerNode::_bind_methods() { ADD_SIGNAL(MethodInfo(sig_connection_lost)); ClassDB::bind_method(D_METHOD("open"), &self_type::open); + ClassDB::bind_method(D_METHOD("close"), &self_type::close); + ClassDB::bind_method(D_METHOD("is_open"), &self_type::is_open); + ClassDB::bind_static_method(self_type::get_class_static(), "get_singleton", &self_type::get_singleton); } void ServerNode::enter_tree() { @@ -25,17 +28,20 @@ void ServerNode::enter_tree() { } void ServerNode::process(double delta) { + bool new_is_connected{ ydi::server::has_client() }; + if (this->is_connected != new_is_connected) { + this->is_connected = new_is_connected; + emit_signal(this->is_connected ? sig_connection_established : sig_connection_lost); + } + if (!ydi::server::has_client()) { + return; + } Vector new_clues{}; if (ydi::server::receive::new_clues(new_clues)) { for (NetworkData::ClueID clue : new_clues) { emit_signal(sig_clue_revealed, clue); } } - bool new_is_connected{ ydi::server::has_client() }; - if (this->is_connected != new_is_connected) { - this->is_connected = new_is_connected; - emit_signal(this->is_connected ? sig_connection_established : sig_connection_lost); - } } void ServerNode::exit_tree() { @@ -69,6 +75,14 @@ ServerNode *ServerNode::get_singleton() { return singleton_instance; } -void ServerNode::open() { - ydi::server::open(); +bool ServerNode::open() { + return ydi::server::open(); +} + +void ServerNode::close() { + ydi::server::close(); +} + +bool ServerNode::is_open() const { + return ydi::server::is_running(); } diff --git a/modules/you_done_it/server_node.h b/modules/you_done_it/server_node.h index ab6d8a91..c522354a 100644 --- a/modules/you_done_it/server_node.h +++ b/modules/you_done_it/server_node.h @@ -15,7 +15,9 @@ protected: public: static ServerNode *get_singleton(); - void open(); + bool open(); + void close(); + bool is_open() const; public: static String const sig_clue_revealed; diff --git a/modules/you_done_it/ydi_server.cpp b/modules/you_done_it/ydi_server.cpp index 160b2602..cc768388 100644 --- a/modules/you_done_it/ydi_server.cpp +++ b/modules/you_done_it/ydi_server.cpp @@ -99,10 +99,10 @@ void receive_thread_entry() { } } -void open() { +bool open() { if (service) { print_error("Server: Detected attempt to open duplicate Server, exiting without action."); - return; + return false; } print_line("Server: Starting"); service.emplace(); @@ -111,7 +111,7 @@ void open() { } catch (...) { service.reset(); print_line("Server: Failed to create context"); - return; + return false; } print_line("Server: Created zmq context"); try { @@ -121,7 +121,7 @@ void open() { service->context.reset(); service.reset(); print_line("Server: Failed to create socket"); - return; + return false; } print_line("Server: Created socket"); try { @@ -133,12 +133,13 @@ void open() { service->context.reset(); service.reset(); print_line("Server: Failed to bind socket"); - return; + return false; } print_line("Server: Bound socket"); receive_thread.emplace(receive_thread_entry); assert(receive_thread->joinable()); print_line("Server: Startup complete!"); + return true; } void close() { @@ -170,16 +171,22 @@ void close() { } bool has_client() { - if (service) { - std::scoped_lock lock{ service->mtx }; - return service->client.has_value(); - } else { + if (!service) { return false; } + std::scoped_lock lock{ service->mtx }; + return service->client.has_value(); +} + +bool is_running() { + return service.has_value(); } namespace receive { bool new_clues(Vector &out) { + if (!service) { + return false; + } std::scoped_lock lock{ service->mtx }; bool const has_new{ !service->new_clues.is_empty() }; if (has_new) { diff --git a/modules/you_done_it/ydi_server.h b/modules/you_done_it/ydi_server.h index 56940f14..a8683324 100644 --- a/modules/you_done_it/ydi_server.h +++ b/modules/you_done_it/ydi_server.h @@ -5,9 +5,10 @@ #include namespace ydi::server { -void open(); +bool open(); void close(); bool has_client(); +bool is_running(); namespace receive { bool new_clues(Vector &out); From eafdbba3d73a610f80c350eaa34520b238af9930 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 29 Oct 2025 17:19:50 +0100 Subject: [PATCH 4/4] feat: started making flatscreen gameplay scenes --- flatscreen-project/project.godot | 2 +- .../scenes/flatscreen_root.tscn | 20 +++--- .../scenes/start_server_ui.tscn | 68 +++++++++++++++++++ 3 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 flatscreen-project/scenes/start_server_ui.tscn diff --git a/flatscreen-project/project.godot b/flatscreen-project/project.godot index 69c22811..1b3cee73 100644 --- a/flatscreen-project/project.godot +++ b/flatscreen-project/project.godot @@ -11,6 +11,6 @@ config_version=5 [application] config/name="you_done_it" -run/main_scene="uid://bbvpj46frv0ho" +run/main_scene="uid://dosb4sb7pvss4" config/features=PackedStringArray("4.5", "Forward Plus") config/icon="res://icon.svg" diff --git a/flatscreen-project/scenes/flatscreen_root.tscn b/flatscreen-project/scenes/flatscreen_root.tscn index a00c5e5e..e91f50bd 100644 --- a/flatscreen-project/scenes/flatscreen_root.tscn +++ b/flatscreen-project/scenes/flatscreen_root.tscn @@ -1,14 +1,12 @@ -[gd_scene format=3 uid="uid://dosb4sb7pvss4"] +[gd_scene load_steps=2 format=3 uid="uid://dosb4sb7pvss4"] -[node name="ServerNode" type="ServerNode"] +[sub_resource type="QuadMesh" id="QuadMesh_usqe2"] -[node name="AspectRatioContainer" type="AspectRatioContainer" parent="."] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -ratio = 1.7778 +[node name="FlatscreenRoot" type="Node2D"] -[node name="PanelContainer" type="PanelContainer" parent="AspectRatioContainer"] -layout_mode = 2 +[node name="Camera2D" type="Camera2D" parent="."] + +[node name="MeshInstance2D" type="MeshInstance2D" parent="."] +position = Vector2(142, -50) +scale = Vector2(762.00006, 514) +mesh = SubResource("QuadMesh_usqe2") diff --git a/flatscreen-project/scenes/start_server_ui.tscn b/flatscreen-project/scenes/start_server_ui.tscn new file mode 100644 index 00000000..f12db7eb --- /dev/null +++ b/flatscreen-project/scenes/start_server_ui.tscn @@ -0,0 +1,68 @@ +[gd_scene load_steps=2 format=3 uid="uid://owa17yo7q6wo"] + +[sub_resource type="GDScript" id="GDScript_usqe2"] +resource_name = "StartServerUI" +script/source = "extends CenterContainer + +@onready var label := $VBoxContainer/ConnectingText +@onready var open_server_btn := $VBoxContainer/OpenServerButton +@onready var close_server_btn := $VBoxContainer/CloseServerButton + +func _ready(): + ServerNode.get_singleton().connection_established.connect(self._on_server_node_connection_established) + +func _on_open_button_pressed() -> void: + if not ServerNode.get_singleton().is_open(): + if ServerNode.get_singleton().open(): + label.visible = true + close_server_btn.visible = true + open_server_btn.visible = false + +func _on_close_button_pressed() -> void: + if ServerNode.get_singleton().is_open(): + ServerNode.get_singleton().close() + label.visible = false + close_server_btn.visible = false + open_server_btn.visible = true + +func _on_server_node_connection_established() -> void: + self.visible = false +" + +[node name="StartServerUI" type="CenterContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = SubResource("GDScript_usqe2") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="OpenServerButton" type="Button" parent="VBoxContainer"] +layout_mode = 2 +text = "Host Game Server" + +[node name="CloseServerButton" type="Button" parent="VBoxContainer"] +visible = false +layout_mode = 2 +text = "Cancel Connection" + +[node name="ConnectingText" type="Label" parent="VBoxContainer"] +visible = false +layout_mode = 2 +text = "Waiting for client..." +horizontal_alignment = 1 + +[node name="PermissionsText" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Requires permissions to open port 6667. +If you have a firewall on your system you +may need to open configure it" +horizontal_alignment = 1 + +[connection signal="pressed" from="VBoxContainer/OpenServerButton" to="." method="_on_open_button_pressed"] +[connection signal="pressed" from="VBoxContainer/CloseServerButton" to="." method="_on_close_button_pressed"]