From b4a39b7c120f5caaeeaa8ac7d8f8bc6c591bb48c Mon Sep 17 00:00:00 2001 From: Lurkars Date: Tue, 16 Jul 2019 19:57:13 +0200 Subject: [PATCH] menus menus menus, network logic, dedicated server logic --- project.godot | 2 +- scenes/lobby/lobby_old.tscn | 160 ------------------------ scenes/menu/base_menu.tscn | 29 +++++ scenes/menu/direct_host.tscn | 38 +++--- scenes/menu/direct_join.tscn | 26 ++-- scenes/menu/lobby.tscn | 120 +++++------------- scenes/menu/local_game.tscn | 28 +++-- scenes/menu/main.tscn | 5 + scenes/menu/player_settings.tscn | 2 +- scenes/menu/server.tscn | 70 +++++------ scenes/menu/settings.tscn | 72 +++++++++++ scenes/player/HumanPlayer.tscn | 6 +- scripts/game/game.gd | 114 ++++++++++++----- scripts/game/game_state.gd | 203 ------------------------------- scripts/game/local_storage.gd | 45 +++++++ scripts/game/route.gd | 2 +- scripts/game/server.gd | 5 - scripts/game/world.gd | 8 +- scripts/lobby/lobby.gd | 83 ------------- scripts/menu/direct_host.gd | 18 +-- scripts/menu/direct_join.gd | 8 +- scripts/menu/lobby.gd | 28 +++-- scripts/menu/local_game.gd | 10 +- scripts/menu/main.gd | 28 ++++- scripts/menu/player_settings.gd | 14 ++- scripts/menu/server.gd | 13 +- scripts/menu/settings.gd | 22 ++++ scripts/player/HumanControls.gd | 4 +- scripts/player/Player.gd | 3 + scripts/player/raceCar.gd | 2 +- 30 files changed, 473 insertions(+), 695 deletions(-) delete mode 100644 scenes/lobby/lobby_old.tscn create mode 100644 scenes/menu/base_menu.tscn create mode 100644 scenes/menu/settings.tscn delete mode 100644 scripts/game/game_state.gd create mode 100644 scripts/game/local_storage.gd delete mode 100644 scripts/game/server.gd delete mode 100644 scripts/lobby/lobby.gd create mode 100644 scripts/menu/settings.gd diff --git a/project.godot b/project.godot index 3588923..0ec64e1 100644 --- a/project.godot +++ b/project.godot @@ -69,9 +69,9 @@ config/icon="res://icon.png" [autoload] game="*res://scripts/game/game.gd" -game_state="*res://scripts/game/game_state.gd" roads_factory="*res://scripts/road/roads_factory.gd" Util="*res://scripts/Util.gd" +local_storage="*res://scripts/game/local_storage.gd" [input] diff --git a/scenes/lobby/lobby_old.tscn b/scenes/lobby/lobby_old.tscn deleted file mode 100644 index cfdb49f..0000000 --- a/scenes/lobby/lobby_old.tscn +++ /dev/null @@ -1,160 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://scripts/lobby/lobby.gd" type="Script" id=1] - -[node name="lobby" type="Control"] -anchor_right = 1.0 -anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = -1.95001 -margin_right = 4.0 -margin_bottom = -1.95001 -size_flags_horizontal = 2 -size_flags_vertical = 2 -script = ExtResource( 1 ) - -[node name="players" type="Panel" parent="."] -editor/display_folded = true -visible = false -margin_left = 393.0 -margin_top = 113.0 -margin_right = 645.0 -margin_bottom = 468.0 -size_flags_horizontal = 2 -size_flags_vertical = 2 - -[node name="label" type="Label" parent="players"] -margin_left = 26.0 -margin_top = 18.0 -margin_right = 142.0 -margin_bottom = 32.0 -size_flags_horizontal = 2 -size_flags_vertical = 0 -text = "Awaiting Players..." - -[node name="start" type="Button" parent="players"] -margin_left = 68.0 -margin_top = 307.0 -margin_right = 193.0 -margin_bottom = 336.0 -size_flags_horizontal = 2 -size_flags_vertical = 2 -text = "START!" - -[node name="list" type="ItemList" parent="players"] -margin_left = 25.0 -margin_top = 37.0 -margin_right = 229.0 -margin_bottom = 296.0 -size_flags_horizontal = 2 -size_flags_vertical = 2 - -[node name="connect" type="Panel" parent="."] -margin_left = 370.0 -margin_top = 157.0 -margin_right = 647.0 -margin_bottom = 401.0 -rect_pivot_offset = Vector2( 70, 63 ) -size_flags_horizontal = 2 -size_flags_vertical = 2 - -[node name="name_label" type="Label" parent="connect"] -margin_left = 14.0 -margin_top = 11.0 -margin_right = 56.0 -margin_bottom = 25.0 -size_flags_horizontal = 2 -size_flags_vertical = 0 -text = "Name:" - -[node name="name" type="LineEdit" parent="connect"] -margin_left = 17.0 -margin_top = 30.0 -margin_right = 173.0 -margin_bottom = 54.0 -size_flags_horizontal = 2 -size_flags_vertical = 2 -text = "Undefined" - -[node name="color_label" type="Label" parent="connect"] -margin_left = 14.0 -margin_top = 69.0 -margin_right = 56.0 -margin_bottom = 83.0 -size_flags_horizontal = 2 -size_flags_vertical = 0 -text = "Color:" - -[node name="color" type="ColorPickerButton" parent="connect"] -margin_left = 20.05 -margin_top = 94.3 -margin_right = 243.05 -margin_bottom = 114.3 -text = "Color" -edit_alpha = false - -[node name="ip_label" type="Label" parent="connect"] -margin_left = 15.0 -margin_top = 128.0 -margin_right = 57.0 -margin_bottom = 142.0 -rect_pivot_offset = Vector2( 33, 7 ) -size_flags_horizontal = 2 -size_flags_vertical = 0 -text = "IP:" - -[node name="ip" type="LineEdit" parent="connect"] -margin_left = 17.0 -margin_top = 147.0 -margin_right = 173.0 -margin_bottom = 171.0 -size_flags_horizontal = 2 -size_flags_vertical = 2 -text = "127.0.0.1" - -[node name="host" type="Button" parent="connect"] -margin_left = 181.0 -margin_top = 31.0 -margin_right = 246.0 -margin_bottom = 51.0 -size_flags_horizontal = 2 -size_flags_vertical = 2 -text = "Host" - -[node name="join" type="Button" parent="connect"] -margin_left = 181.0 -margin_top = 149.0 -margin_right = 246.0 -margin_bottom = 169.0 -size_flags_horizontal = 2 -size_flags_vertical = 2 -text = "Join" - -[node name="quick" type="Button" parent="connect"] -margin_left = 103.0 -margin_top = 214.0 -margin_right = 168.0 -margin_bottom = 234.0 -size_flags_horizontal = 2 -size_flags_vertical = 2 -text = "Quick" - -[node name="error_label" type="Label" parent="connect"] -margin_left = 15.0 -margin_top = 177.0 -margin_right = 257.0 -margin_bottom = 191.0 -size_flags_horizontal = 2 -size_flags_vertical = 0 -custom_colors/font_color = Color( 0.820312, 0.291595, 0.291595, 1 ) -align = 1 - -[node name="error" type="AcceptDialog" parent="."] -margin_right = 55.0 -margin_bottom = 58.0 -size_flags_horizontal = 2 -size_flags_vertical = 2 -[connection signal="pressed" from="players/start" to="." method="_on_start_pressed"] -[connection signal="pressed" from="connect/host" to="." method="_on_host_pressed"] -[connection signal="pressed" from="connect/join" to="." method="_on_join_pressed"] -[connection signal="pressed" from="connect/quick" to="." method="_on_quick_pressed"] diff --git a/scenes/menu/base_menu.tscn b/scenes/menu/base_menu.tscn new file mode 100644 index 0000000..49945e9 --- /dev/null +++ b/scenes/menu/base_menu.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://resources/ui/font.tres" type="DynamicFont" id=1] +[ext_resource path="res://assets/icons/return.png" type="Texture" id=2] + +[node name="menu" type="Panel"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -454.0 +margin_top = -234.5 +margin_right = 454.0 +margin_bottom = 234.5 +grow_horizontal = 2 +grow_vertical = 2 +rect_clip_content = true +size_flags_horizontal = 4 +size_flags_vertical = 4 + +[node name="back" type="Button" parent="."] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -56.0 +margin_right = 132.0 +custom_fonts/font = ExtResource( 1 ) +text = "Back" +icon = ExtResource( 2 ) +flat = true diff --git a/scenes/menu/direct_host.tscn b/scenes/menu/direct_host.tscn index 33ff4f6..5314e5f 100644 --- a/scenes/menu/direct_host.tscn +++ b/scenes/menu/direct_host.tscn @@ -24,17 +24,19 @@ anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 margin_left = -217.5 -margin_top = -74.5 +margin_top = -60.5 margin_right = 217.5 -margin_bottom = 74.5 +margin_bottom = 60.5 grow_horizontal = 2 grow_vertical = 2 [node name="host" type="Button" parent="menu"] -margin_left = 290.439 -margin_top = 72.3169 -margin_right = 433.439 -margin_bottom = 128.317 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -143.0 +margin_top = -56.0001 rect_pivot_offset = Vector2( 1.89856, 0.845154 ) custom_fonts/font = ExtResource( 3 ) text = "Host" @@ -42,10 +44,10 @@ icon = ExtResource( 4 ) flat = true [node name="back" type="Button" parent="menu"] -margin_left = 4.93381 -margin_top = 79.1761 -margin_right = 136.934 -margin_bottom = 135.176 +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -56.0 +margin_right = 132.0 rect_pivot_offset = Vector2( 0.606262, -0.447205 ) custom_fonts/font = ExtResource( 3 ) text = "Back" @@ -53,17 +55,21 @@ icon = ExtResource( 5 ) flat = true [node name="port_label" type="Label" parent="menu"] -margin_left = 29.8937 +margin_left = 122.969 margin_top = 30.2159 -margin_right = 94.8937 +margin_right = 187.969 margin_bottom = 57.2159 text = "Port" [node name="port" type="LineEdit" parent="menu"] -margin_left = 151.75 -margin_top = 25.1615 -margin_right = 259.75 -margin_bottom = 62.1615 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_left = -219.911 +margin_top = -34.0125 +margin_right = -111.911 +margin_bottom = 2.98752 text = "8128" max_length = 5 [connection signal="pressed" from="menu/host" to="." method="_on_host_pressed"] diff --git a/scenes/menu/direct_join.tscn b/scenes/menu/direct_join.tscn index 6d32303..52afca8 100644 --- a/scenes/menu/direct_join.tscn +++ b/scenes/menu/direct_join.tscn @@ -24,17 +24,19 @@ anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 margin_left = -217.5 -margin_top = -116.0 +margin_top = -89.5 margin_right = 217.5 -margin_bottom = 116.0 +margin_bottom = 89.5 grow_horizontal = 2 grow_vertical = 2 [node name="join" type="Button" parent="menu"] -margin_left = 289.079 -margin_top = 175.705 -margin_right = 432.079 -margin_bottom = 231.705 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -143.0 +margin_top = -56.0 rect_pivot_offset = Vector2( 1.89856, 0.845154 ) custom_fonts/font = ExtResource( 3 ) text = "Join" @@ -42,10 +44,10 @@ icon = ExtResource( 4 ) flat = true [node name="back" type="Button" parent="menu"] -margin_left = 3.57346 -margin_top = 173.042 -margin_right = 135.574 -margin_bottom = 229.042 +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -56.0 +margin_right = 132.001 rect_pivot_offset = Vector2( 0.606262, -0.447205 ) custom_fonts/font = ExtResource( 3 ) text = "Back" @@ -92,5 +94,9 @@ margin_bottom = 60.0 custom_colors/font_color = Color( 1, 0, 0.117647, 1 ) align = 1 valign = 1 + +[node name="error_dialog" type="AcceptDialog" parent="."] +margin_right = 138.0 +margin_bottom = 84.0 [connection signal="pressed" from="menu/join" to="." method="_on_join_pressed"] [connection signal="pressed" from="menu/back" to="." method="_on_back_pressed"] diff --git a/scenes/menu/lobby.tscn b/scenes/menu/lobby.tscn index a979b5d..466be8b 100644 --- a/scenes/menu/lobby.tscn +++ b/scenes/menu/lobby.tscn @@ -1,17 +1,16 @@ -[gd_scene load_steps=10 format=2] +[gd_scene load_steps=9 format=2] [ext_resource path="res://resources/ui/theme.tres" type="Theme" id=1] [ext_resource path="res://scripts/menu/lobby.gd" type="Script" id=2] -[ext_resource path="res://assets/icons/checkmark.png" type="Texture" id=3] -[ext_resource path="res://assets/icons/question.png" type="Texture" id=4] -[ext_resource path="res://resources/ui/font.tres" type="DynamicFont" id=5] -[ext_resource path="res://assets/icons/return.png" type="Texture" id=6] -[ext_resource path="res://scripts/menu/player_settings.gd" type="Script" id=7] -[ext_resource path="res://assets/fonts/Kenney Future Narrow.ttf" type="DynamicFontData" id=8] +[ext_resource path="res://scenes/menu/base_menu.tscn" type="PackedScene" id=3] +[ext_resource path="res://assets/icons/checkmark.png" type="Texture" id=4] +[ext_resource path="res://assets/icons/question.png" type="Texture" id=5] +[ext_resource path="res://scenes/menu/player_settings.tscn" type="PackedScene" id=6] +[ext_resource path="res://assets/fonts/Kenney Future Narrow.ttf" type="DynamicFontData" id=7] [sub_resource type="DynamicFont" id=1] size = 100 -font_data = ExtResource( 8 ) +font_data = ExtResource( 7 ) [node name="lobby" type="Control"] anchor_right = 1.0 @@ -23,97 +22,44 @@ margin_bottom = 0.857422 theme = ExtResource( 1 ) script = ExtResource( 2 ) -[node name="menu" type="Panel" parent="."] -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -margin_left = -446.428 -margin_top = -236.0 -margin_right = 446.572 -margin_bottom = 235.0 -grow_horizontal = 2 -grow_vertical = 2 +[node name="menu" parent="." instance=ExtResource( 3 )] [node name="players" type="ItemList" parent="menu"] margin_left = 13.0 -margin_top = 19.0 +margin_top = 18.0 margin_right = 500.0 -margin_bottom = 414.0 +margin_bottom = 413.0 [node name="ready_icon" type="Button" parent="menu/players"] visible = false -margin_right = 12.0 -margin_bottom = 33.0 -icon = ExtResource( 3 ) +margin_right = 62.0 +margin_bottom = 56.0 +icon = ExtResource( 4 ) [node name="not_ready_icon" type="Button" parent="menu/players"] visible = false -margin_right = 12.0 -margin_bottom = 33.0 -icon = ExtResource( 4 ) +margin_right = 62.0 +margin_bottom = 56.0 +icon = ExtResource( 5 ) + +[node name="player_settings" parent="menu" instance=ExtResource( 6 )] +margin_left = 510.586 +margin_top = 21.0499 +margin_right = 875.586 +margin_bottom = 238.05 [node name="ready" type="CheckButton" parent="menu"] -margin_left = 723.0 -margin_top = 412.0 -margin_right = 889.0 -margin_bottom = 470.0 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -166.0 +margin_top = -58.0 text = "Ready" flat = true -[node name="back" type="Button" parent="menu"] -margin_left = 10.0 -margin_top = 413.0 -margin_right = 142.0 -margin_bottom = 469.0 -custom_fonts/font = ExtResource( 5 ) -text = "Back" -icon = ExtResource( 6 ) -flat = true - -[node name="settings" type="Control" parent="menu"] -margin_left = 513.0 -margin_top = 23.0 -margin_right = 878.0 -margin_bottom = 240.0 -script = ExtResource( 7 ) - -[node name="name_label" type="Label" parent="menu/settings"] -anchor_top = 0.5 -anchor_right = 1.0 -anchor_bottom = 0.5 -margin_top = -95.5 -margin_bottom = -68.5 -text = "Name" - -[node name="name" type="LineEdit" parent="menu/settings"] -anchor_top = 0.5 -anchor_right = 1.0 -anchor_bottom = 0.5 -margin_top = -51.5 -margin_bottom = -14.5 - -[node name="color_label" type="Label" parent="menu/settings"] -anchor_top = 0.5 -anchor_right = 1.0 -anchor_bottom = 0.5 -margin_top = 1.5 -margin_bottom = 28.5 -text = "Color" - -[node name="color" type="ColorPickerButton" parent="menu/settings"] -anchor_top = 0.5 -anchor_right = 1.0 -anchor_bottom = 0.5 -margin_top = 46.5 -margin_bottom = 79.5 - -[node name="disconnected_dialog" type="AcceptDialog" parent="."] -margin_right = 138.0 -margin_bottom = 84.0 -dialog_text = "Server disconnected!" - [node name="countdown" type="Label" parent="."] +visible = false anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 @@ -128,11 +74,9 @@ align = 1 valign = 1 [node name="countdown_timer" type="Timer" parent="."] +process_mode = 0 wait_time = 3.0 one_shot = true [connection signal="toggled" from="menu/ready" to="." method="_on_ready_toggled"] -[connection signal="pressed" from="menu/back" to="." method="_on_back_pressed"] -[connection signal="text_changed" from="menu/settings/name" to="." method="_on_name_text_changed"] -[connection signal="color_changed" from="menu/settings/color" to="." method="_on_color_color_changed"] -[connection signal="confirmed" from="disconnected_dialog" to="." method="_on_disconnected_dialog_confirmed"] -[connection signal="popup_hide" from="disconnected_dialog" to="." method="_on_disconnected_dialog_popup_hide"] + +[editable path="menu"] diff --git a/scenes/menu/local_game.tscn b/scenes/menu/local_game.tscn index c921b1a..616b947 100644 --- a/scenes/menu/local_game.tscn +++ b/scenes/menu/local_game.tscn @@ -30,19 +30,21 @@ grow_horizontal = 2 grow_vertical = 2 [node name="bots" type="CheckButton" parent="menu"] -margin_left = 26.8485 -margin_top = 239.232 -margin_right = 192.849 -margin_bottom = 297.232 +margin_left = 18.8485 +margin_top = 238.232 +margin_right = 184.849 +margin_bottom = 296.232 pressed = true text = "Bots" flat = true [node name="start" type="Button" parent="menu"] -margin_left = 289.147 -margin_top = 315.816 -margin_right = 432.147 -margin_bottom = 371.816 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -143.0 +margin_top = -56.0 rect_pivot_offset = Vector2( 1.89856, 0.845154 ) custom_fonts/font = ExtResource( 3 ) text = "Start" @@ -50,17 +52,17 @@ icon = ExtResource( 4 ) flat = true [node name="back" type="Button" parent="menu"] -margin_left = 2.24423 -margin_top = 317.401 -margin_right = 134.244 -margin_bottom = 373.401 +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -56.0 +margin_right = 132.0 rect_pivot_offset = Vector2( 0.606262, -0.447205 ) custom_fonts/font = ExtResource( 3 ) text = "Back" icon = ExtResource( 5 ) flat = true -[node name="settings" parent="menu" instance=ExtResource( 6 )] +[node name="player_settings" parent="menu" instance=ExtResource( 6 )] margin_left = 27.4727 margin_top = 18.9189 margin_right = 392.473 diff --git a/scenes/menu/main.tscn b/scenes/menu/main.tscn index 4821aec..fec2c01 100644 --- a/scenes/menu/main.tscn +++ b/scenes/menu/main.tscn @@ -112,6 +112,11 @@ margin_right = 290.885 margin_bottom = 58.3229 text = "Join" icon = ExtResource( 8 ) + +[node name="error_dialog" type="AcceptDialog" parent="."] +margin_right = 138.0 +margin_bottom = 84.0 +dialog_text = "Server disconnected!" [connection signal="pressed" from="menu/online" to="." method="_on_online_pressed"] [connection signal="pressed" from="menu/practice" to="." method="_on_practice_pressed"] [connection signal="pressed" from="menu/settings" to="." method="_on_settings_pressed"] diff --git a/scenes/menu/player_settings.tscn b/scenes/menu/player_settings.tscn index d39e8c4..6820c19 100644 --- a/scenes/menu/player_settings.tscn +++ b/scenes/menu/player_settings.tscn @@ -2,7 +2,7 @@ [ext_resource path="res://scripts/menu/player_settings.gd" type="Script" id=1] -[node name="settings" type="Control"] +[node name="player_settings" type="Control"] margin_left = 513.0 margin_top = 23.0 margin_right = 878.0 diff --git a/scenes/menu/server.tscn b/scenes/menu/server.tscn index 332a0c4..6fcf05d 100644 --- a/scenes/menu/server.tscn +++ b/scenes/menu/server.tscn @@ -1,13 +1,12 @@ -[gd_scene load_steps=9 format=2] +[gd_scene load_steps=8 format=2] [ext_resource path="res://resources/ui/theme.tres" type="Theme" id=1] [ext_resource path="res://scripts/menu/server.gd" type="Script" id=2] -[ext_resource path="res://assets/icons/exitRight.png" type="Texture" id=3] -[ext_resource path="res://assets/icons/fistPlus.png" type="Texture" id=4] -[ext_resource path="res://resources/ui/font.tres" type="DynamicFont" id=5] -[ext_resource path="res://assets/icons/return.png" type="Texture" id=6] -[ext_resource path="res://assets/icons/cpu.png" type="Texture" id=7] -[ext_resource path="res://assets/icons/open.png" type="Texture" id=8] +[ext_resource path="res://scenes/menu/base_menu.tscn" type="PackedScene" id=3] +[ext_resource path="res://assets/icons/exitRight.png" type="Texture" id=4] +[ext_resource path="res://assets/icons/fistPlus.png" type="Texture" id=5] +[ext_resource path="res://assets/icons/cpu.png" type="Texture" id=6] +[ext_resource path="res://assets/icons/open.png" type="Texture" id=7] [node name="server" type="Control"] anchor_right = 1.0 @@ -19,19 +18,10 @@ margin_bottom = 0.857422 theme = ExtResource( 1 ) script = ExtResource( 2 ) -[node name="menu" type="Panel" parent="."] -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -margin_left = -446.428 -margin_top = -236.0 -margin_right = 446.572 -margin_bottom = 235.0 -grow_horizontal = 2 -grow_vertical = 2 +[node name="menu" parent="." instance=ExtResource( 3 )] [node name="filter" type="Control" parent="menu"] +editor/display_folded = true margin_left = 14.0 margin_top = 16.0 margin_right = 878.0 @@ -54,31 +44,26 @@ margin_right = 880.0 margin_bottom = 414.0 [node name="join" type="Button" parent="menu"] -margin_left = 755.0 -margin_top = 413.0 -margin_right = 875.0 -margin_bottom = 469.0 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -120.0 +margin_top = -56.0 text = "Join" -icon = ExtResource( 3 ) +icon = ExtResource( 4 ) flat = true [node name="create" type="Button" parent="menu"] -margin_left = 499.0 -margin_top = 414.0 -margin_right = 739.0 -margin_bottom = 470.0 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -366.0 +margin_top = -56.0 +margin_right = -126.0 text = "Create Game" -icon = ExtResource( 4 ) -flat = true - -[node name="back" type="Button" parent="menu"] -margin_left = 10.0 -margin_top = 413.0 -margin_right = 142.0 -margin_bottom = 469.0 -custom_fonts/font = ExtResource( 5 ) -text = "Back" -icon = ExtResource( 6 ) +icon = ExtResource( 5 ) flat = true [node name="direct_host" type="Button" parent="menu"] @@ -87,7 +72,7 @@ margin_top = 2.0 margin_right = 235.0 margin_bottom = 58.0 text = "Direct Host" -icon = ExtResource( 7 ) +icon = ExtResource( 6 ) flat = true [node name="direct_join" type="Button" parent="menu"] @@ -96,8 +81,11 @@ margin_top = 2.0 margin_right = 446.0 margin_bottom = 58.0 text = "Direct Join" -icon = ExtResource( 8 ) +icon = ExtResource( 7 ) flat = true -[connection signal="pressed" from="menu/back" to="." method="_on_back_pressed"] + +[node name="error_dialog" type="AcceptDialog" parent="."] +margin_right = 138.0 +margin_bottom = 84.0 [connection signal="pressed" from="menu/direct_host" to="." method="_on_direct_host_pressed"] [connection signal="pressed" from="menu/direct_join" to="." method="_on_direct_join_pressed"] diff --git a/scenes/menu/settings.tscn b/scenes/menu/settings.tscn new file mode 100644 index 0000000..35ef521 --- /dev/null +++ b/scenes/menu/settings.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://resources/ui/theme.tres" type="Theme" id=1] +[ext_resource path="res://scripts/menu/settings.gd" type="Script" id=2] +[ext_resource path="res://scenes/menu/base_menu.tscn" type="PackedScene" id=3] +[ext_resource path="res://scenes/menu/player_settings.tscn" type="PackedScene" id=4] +[ext_resource path="res://assets/icons/save.png" type="Texture" id=5] + +[node name="settings" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 1.45612 +margin_top = 1.45612 +margin_right = 1.45605 +margin_bottom = 1.45612 +theme = ExtResource( 1 ) +script = ExtResource( 2 ) + +[node name="menu" parent="." instance=ExtResource( 3 )] + +[node name="tabs" type="TabContainer" parent="menu"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -438.5 +margin_top = -217.5 +margin_right = 440.5 +margin_bottom = 177.5 +tab_align = 0 + +[node name="Game" type="Tabs" parent="menu/tabs"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 45.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="player_settings" parent="menu/tabs/Game" instance=ExtResource( 4 )] +margin_left = 15.4583 +margin_top = 10.7114 +margin_right = 380.458 +margin_bottom = 227.711 + +[node name="bots" type="CheckButton" parent="menu/tabs/Game"] +margin_left = 8.38535 +margin_top = 226.162 +margin_right = 153.385 +margin_bottom = 266.162 +text = "Bots" + +[node name="Controls" type="Tabs" parent="menu/tabs"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 45.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="save" type="Button" parent="menu"] +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -147.0 +margin_top = -56.0 +text = "Save" +icon = ExtResource( 5 ) +flat = true +[connection signal="pressed" from="menu/save" to="." method="_on_save_pressed"] diff --git a/scenes/player/HumanPlayer.tscn b/scenes/player/HumanPlayer.tscn index 98477a4..3009e7b 100644 --- a/scenes/player/HumanPlayer.tscn +++ b/scenes/player/HumanPlayer.tscn @@ -55,9 +55,6 @@ custom_colors/font_color = Color( 0, 0, 0, 1 ) align = 1 valign = 1 -[node name="ingame_menu" parent="hud" instance=ExtResource( 3 )] -visible = false - [node name="speed" type="Label" parent="hud"] anchor_left = 0.5 anchor_top = 1.0 @@ -87,6 +84,9 @@ align = 1 valign = 1 uppercase = true +[node name="ingame_menu" parent="hud" instance=ExtResource( 3 )] +visible = false + [node name="inventory" type="Spatial" parent="."] editor/display_folded = true script = ExtResource( 4 ) diff --git a/scripts/game/game.gd b/scripts/game/game.gd index ef30f4a..1d0b88e 100644 --- a/scripts/game/game.gd +++ b/scripts/game/game.gd @@ -1,6 +1,7 @@ extends Node const MAX_PEERS = 4 +const LOBBY_READY_WAIT_TIME = 3 var world_scene = preload("res://scenes/game/world.tscn") var player_scene = preload("res://scenes/player/Player.tscn") @@ -10,6 +11,7 @@ var bot_player_scene = preload("res://scenes/player/BotPlayer.tscn") var players = {} var game_running:bool = false +var dedicated_server:bool = false var game_ready_timer:Timer @@ -23,22 +25,38 @@ signal game_ended() signal game_error(type, data) func _ready(): - var arguments = {} for argument in OS.get_cmdline_args(): - if argument.split("=")[0] == "port": - host_game(int(argument.split("=")[1])) - + if argument.split("=")[0] == "--port": + var err = host_game(int(argument.split("=")[1])) + if err != OK: + print("Could not create Server!") + get_tree().quit() + dedicated_server = true + func host_game(port:int): var host = NetworkedMultiplayerENet.new() - host.create_server(port, MAX_PEERS) + var err = host.create_server(port, MAX_PEERS) get_tree().set_network_peer(host) + get_tree().connect("network_peer_connected", self, "_player_connected") get_tree().connect("network_peer_disconnected", self,"_player_disconnected") - game_ready_timer = Timer.new() - get_tree().get_root().add_child(game_ready_timer) - game_ready_timer.set_one_shot(true) - game_ready_timer.set_wait_time(3) - game_ready_timer.connect("timeout",self,"start_game") + + if game_ready_timer == null: + game_ready_timer = Timer.new() + game_ready_timer.set_name("game_ready_timer") + game_ready_timer.set_timer_process_mode(Timer.TIMER_PROCESS_PHYSICS) + game_ready_timer.set_one_shot(true) + game_ready_timer.set_autostart(false) + game_ready_timer.set_wait_time(LOBBY_READY_WAIT_TIME) + game_ready_timer.connect("timeout",self,"start_game") + add_child(game_ready_timer) + + if err == OK: + print("Game hosted on Port " + str(port)) + else: + emit_signal("game_error", "HOST", err) + + return err func join_game(ip, port:int): get_tree().connect("connected_to_server", self, "_connected_ok") @@ -53,20 +71,28 @@ func _connected_ok(): emit_signal("connection_succeeded") func _connected_fail(): + get_tree().disconnect("connected_to_server", self, "_connected_ok") + get_tree().disconnect("connection_failed", self, "_connected_fail") + get_tree().disconnect("server_disconnected", self, "_server_disconnected") get_tree().set_network_peer(null) emit_signal("connection_failed") func _server_disconnected(): - get_tree().set_network_peer(null) + quit_game() emit_signal("server_disconnected") +func _player_connected(id): + pass + func _player_disconnected(id): - if (get_tree().is_network_server()): + if get_tree().is_network_server(): + print("disconnect: " + str(id)) if game_running: # Game is in progress emit_signal("game_error", "DISCONNECTED", [id]) + rpc("remove_player" ,id) # TODO! else: - remove_player(id) + rpc("remove_player" ,id) remote func set_player(id, new_name:String = " ", new_color:Color = Color.black, new_ready:bool = false): players[id] = {"name" : new_name, "color" : new_color, "ready" : new_ready, "prepared" : false} @@ -75,32 +101,45 @@ remote func set_player(id, new_name:String = " ", new_color:Color = Color.black, if get_tree().is_network_server(): var all_ready = true for p_id in players: - rpc_id(id, "set_player", p_id, players[p_id].name, players[p_id].color, new_ready) + rpc_id(id, "set_player", p_id, players[p_id].name, players[p_id].color, players[p_id].ready) rpc_id(p_id, "set_player", id, new_name, new_color, new_ready) all_ready = all_ready && players[p_id].ready - if all_ready: - game_ready_timer.start() - print("all_ready!") - else: - game_ready_timer.stop() - emit_signal("game_ready", all_ready) + print("set_player:") + print(players[id]) + rpc("game_ready", all_ready) func update_player(new_name:String = " ", new_color:Color = Color.black, new_ready:bool = false): if get_tree().is_network_server(): set_player(get_tree().get_network_unique_id(), new_name, new_color, new_ready) else: - game.rpc("set_player",get_tree().get_network_unique_id(), new_name, new_color, new_ready) + rpc("set_player",get_tree().get_network_unique_id(), new_name, new_color, new_ready) -remote func remove_player(id): +remotesync func remove_player(id): players.erase(id) - if (get_tree().is_network_server()): - for p_id in players: - rpc_id(p_id, "remove_player", id) + + if has_node("/root/world"): + var world = get_node("/root/world") + var world_players = world.get_node("players") + if world_players.has_node(str(id)): + world_players.remove_child(world_players.get_node(str(id))) emit_signal("players_changed", players) + + if get_tree().is_network_server() && game_running && dedicated_server && players.empty(): + print("All players disconnected, close server!") + get_tree().quit() + + +remotesync func game_ready(all_ready:bool): + if get_tree().is_network_server(): + print("game ready: " + str(all_ready)) + if all_ready: + game_ready_timer.start() + else: + game_ready_timer.stop() + emit_signal("game_ready", all_ready) remotesync func prepare_game(bots:bool): - get_tree().set_pause(true) var world = world_scene.instance() @@ -142,14 +181,27 @@ remotesync func prepare_game(bots:bool): bot.set_player(_player_scene.get_path()) bot.set_network_master(get_tree().get_network_unique_id()) _player_scene.set_start(bot_index) + if players.has(get_tree().get_network_unique_id()): + rpc_id(1, "player_prepared", get_tree().get_network_unique_id()) - rpc_id(1, "player_prepared", get_tree().get_network_unique_id()) - + if get_tree().is_network_server(): + if players.has(get_tree().get_network_unique_id()): + player_prepared(get_tree().get_network_unique_id()) + print("prepare game") + print(players) + else: + rpc_id(1, "player_prepared", get_tree().get_network_unique_id()) + + func start_game(): + if get_tree().is_network_server(): + get_tree().set_refuse_new_network_connections(true) + print("start game") + rpc("prepare_game", false) remotesync func player_prepared(id): - if (get_tree().is_network_server()): + if get_tree().is_network_server(): players[id].prepared = true var all_prepared = true for p_id in players: @@ -171,10 +223,12 @@ func local_game(name:String, color:Color, bots:bool): post_start_game() func quit_game(): - if (has_node("/root/world")): + if has_node("/root/world"): get_node("/root/world").queue_free() players.clear() + + get_tree().set_refuse_new_network_connections(false) get_tree().set_network_peer(null) get_tree().get_root().get_node("main_menu").show() game_running = false \ No newline at end of file diff --git a/scripts/game/game_state.gd b/scripts/game/game_state.gd deleted file mode 100644 index 70e711a..0000000 --- a/scripts/game/game_state.gd +++ /dev/null @@ -1,203 +0,0 @@ -extends Node - -# Default game port -const DEFAULT_PORT = 8128 - -# Max number of players -const MAX_PLAYERS = 4 -const MAX_PEERS = MAX_PLAYERS - 1 - - -var world_scene = preload("res://scenes/game/world.tscn") -var player_scene = preload("res://scenes/player/Player.tscn") -var human_player_scene = preload("res://scenes/player/HumanPlayer.tscn") -var bot_player_scene = preload("res://scenes/player/BotPlayer.tscn") - -# Name for my player -var player_name = "Undefined" -var player_color = Color("#000000") - -# Names for remote players in id:name format -var players = {} - -# Signals to let lobby GUI know what's going on -signal player_list_changed() -signal connection_failed() -signal connection_succeeded() -signal game_ended() -signal game_error(msg) - -# Callback from SceneTree -func _player_connected(id): - pass - -# Callback from SceneTree -func _player_disconnected(id): - if (get_tree().is_network_server()): - if (has_node("/root/world")): # Game is in progress - emit_signal("game_error", "Player " + players[id].name + " disconnected") - end_game() - else: # Game is not in progress - # If we are the server, send to the new dude all the already registered players - unregister_player(id) - for p_id in players: - # Erase in the server - rpc_id(p_id, "unregister_player", id) - -# Callback from SceneTree, only for clients (not server) -func _connected_ok(): - # Registration of a client beings here, tell everyone that we are here - rpc("register_player", get_tree().get_network_unique_id(), player_name, player_color) - emit_signal("connection_succeeded") - -# Callback from SceneTree, only for clients (not server) -func _server_disconnected(): - emit_signal("game_error", "Server disconnected") - end_game() - -# Callback from SceneTree, only for clients (not server) -func _connected_fail(): - get_tree().set_network_peer(null) # Remove peer - emit_signal("connection_failed") - -# Lobby management functions -remote func register_player(id, new_player_name, new_player_color): - if (get_tree().is_network_server()): - # If we are the server, let everyone know about the new player - rpc_id(id, "register_player", 1, player_name, player_color) # Send myself to new dude - for p_id in players: # Then, for each remote player - rpc_id(id, "register_player", p_id, players[p_id].name, players[p_id].color) # Send player to new dude - rpc_id(p_id, "register_player", id, new_player_name, new_player_color) # Send new dude to player - - players[id] = {"name" : new_player_name, "color" : new_player_color} - emit_signal("player_list_changed") - -remote func unregister_player(id): - players.erase(id) - emit_signal("player_list_changed") - -remote func pre_start_game(spawn_points): - # Change scene - var world = world_scene.instance() - get_tree().get_root().add_child(world) - - get_tree().get_root().get_node("lobby").hide() - - for p_id in spawn_points: - var controls - var player = player_scene.instance() - - player.set_network_master(p_id) - player.set_name(str(p_id)) - - world.get_node("players").add_child(player) - - if (p_id == get_tree().get_network_unique_id()): - # If node for this peer id, set name - player.set_player_name(player_name) - player.set_player_color(player_color) - controls = human_player_scene.instance() - controls.set_name("HumanControl_" + str(p_id)) - world.add_child(controls) - controls.set_player(player.get_path()) - controls.set_network_master(p_id) - else: - # Otherwise set name from peer - player.set_player_name(players[p_id].name) - player.set_player_color(players[p_id].color) - - player.set_start(player.get_index()) - - var bots = false - if bots: - for index in range(4-spawn_points.size()): - var bot_index = spawn_points.size() + index - var player = player_scene.instance() - player.set_name("bot_player" + str(bot_index)) - world.get_node("players").add_child(player) - player.add_to_group("bots") - if get_tree().is_network_server(): - var bot = bot_player_scene.instance() - bot.set_name("bot" + str(bot_index)) - world.add_child(bot) - bot.set_player(player.get_path()) - bot.set_network_master(get_tree().get_network_unique_id()) - player.set_start(bot_index) - - - if (not get_tree().is_network_server()): - # Tell server we are ready to start - rpc_id(1, "ready_to_start", get_tree().get_network_unique_id()) - elif players.size() == 0: - post_start_game() - -remote func post_start_game(): - get_tree().set_pause(false) # Unpause and unleash the game! - -var players_ready = [] - -remote func ready_to_start(id): - assert(get_tree().is_network_server()) - - if (not id in players_ready): - players_ready.append(id) - - if (players_ready.size() == players.size()): - for p in players: - rpc_id(p, "post_start_game") - post_start_game() - -func host_game(new_player_name, new_player_color): - player_name = new_player_name - player_color = new_player_color - var host = NetworkedMultiplayerENet.new() - host.create_server(DEFAULT_PORT, MAX_PEERS) - get_tree().set_network_peer(host) - -func join_game(ip, new_player_name, new_player_color): - player_name = new_player_name - player_color = new_player_color - var host = NetworkedMultiplayerENet.new() - host.create_client(ip, DEFAULT_PORT) - get_tree().set_network_peer(host) - -func get_player_list(): - return players.values() - -func get_player_name(): - return player_name - -func get_player_color(): - return player_color - -func begin_game(): - assert(get_tree().is_network_server()) - - # Create a dictionary with peer id and respective spawn points, could be improved by randomizing - var spawn_points = {} - spawn_points[1] = 0 # Server in spawn point 0 - var spawn_point_idx = 1 - for p in players: - spawn_points[p] = spawn_point_idx - spawn_point_idx += 1 - # Call to pre-start game with the spawn points - for p in players: - rpc_id(p, "pre_start_game", spawn_points) - - pre_start_game(spawn_points) - -func end_game(): - if (has_node("/root/world")): # Game is in progress - # End it - get_node("/root/world").queue_free() - - emit_signal("game_ended") - players.clear() - get_tree().set_network_peer(null) # End networking - -func _ready(): - get_tree().connect("network_peer_connected", self, "_player_connected") - get_tree().connect("network_peer_disconnected", self,"_player_disconnected") - get_tree().connect("connected_to_server", self, "_connected_ok") - get_tree().connect("connection_failed", self, "_connected_fail") - get_tree().connect("server_disconnected", self, "_server_disconnected") diff --git a/scripts/game/local_storage.gd b/scripts/game/local_storage.gd new file mode 100644 index 0000000..360aec7 --- /dev/null +++ b/scripts/game/local_storage.gd @@ -0,0 +1,45 @@ +extends Node + +const FILE_PATH = "user://local_storage" + +func read_content(): + var f = File.new() + var err = f.open(FILE_PATH, File.READ) + var content = parse_json(f.get_as_text ()) + if content == null: + content = {} + f.close() + return content + +func write_content(content:Dictionary): + var f = File.new() + var err = f.open(FILE_PATH, File.WRITE) + #var err = f.open_encrypted_with_pass(FILE_PATH, File.WRITE, OS.get_unique_id()) + f.store_string(to_json(content)) + f.close() + +func write_value(key:String, value): + var content = read_content() + content[key] = value + write_content(content) + +func read_value(key:String, default = null): + var content = read_content() + if content.has(key): + return content.get(key) + else: + return default + +func delete_value(key:String): + var content = read_content() + content.erase(key) + write_content(content) + +func write_values(new_content:Dictionary): + var content = read_content() + for key in new_content: + content[key] = new_content[key] + write_content(content) + +func read_values(): + return read_content() \ No newline at end of file diff --git a/scripts/game/route.gd b/scripts/game/route.gd index cb5c83b..be7dfa9 100644 --- a/scripts/game/route.gd +++ b/scripts/game/route.gd @@ -20,7 +20,7 @@ remotesync func set_network_master(id:int, recursive:bool = true): remotesync func add_road(type, creator): var transform = get_global_transform() var last_road = get_last_road() - if (last_road != null): + if last_road != null: transform = last_road.get_global_transform(); var curve = last_road.get_curve() transform = transform.translated(curve.get_point_position(curve.get_point_count() - 1)) diff --git a/scripts/game/server.gd b/scripts/game/server.gd deleted file mode 100644 index 2afd73e..0000000 --- a/scripts/game/server.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends Node - -func _ready(): - pass # Replace with function body. - diff --git a/scripts/game/world.gd b/scripts/game/world.gd index 91c3b94..6efb264 100644 --- a/scripts/game/world.gd +++ b/scripts/game/world.gd @@ -21,9 +21,9 @@ func _physics_process(delta): func set_player_order(): players = get_node("players").get_children() players.sort_custom(PlayerSorter,"sort") - if (players.size() > 0 && players[0] != first): + if players.size() > 0 && players[0] != first: new_first(players[0]) - if (players.size() > 0 && players[players.size()-1] != last): + if players.size() > 0 && players[players.size()-1] != last: last = players[players.size()-1] func new_first(player): @@ -35,7 +35,7 @@ func new_first(player): route.rpc("set_network_master",p_id) func destroy_after_last(): - if (last != null): + if last != null: if last.position.x != -1: var max_index = last.position.x - remove_last if max_index > 0: @@ -43,7 +43,7 @@ func destroy_after_last(): route.rpc("remove_road", i) func check_autotrack(): - if (first != null): + if first != null: if first.position.x != -1 && route.get_last_road() != null: if first.position.x == route.get_last_road().get_index(): route.rpc("add_road", roads_factory.STRAIGHT, -1) diff --git a/scripts/lobby/lobby.gd b/scripts/lobby/lobby.gd deleted file mode 100644 index b68a098..0000000 --- a/scripts/lobby/lobby.gd +++ /dev/null @@ -1,83 +0,0 @@ -extends Control - -func _ready(): - # Called every time the node is added to the scene. - game_state.connect("connection_failed", self, "_on_connection_failed") - game_state.connect("connection_succeeded", self, "_on_connection_success") - game_state.connect("player_list_changed", self, "refresh_lobby") - game_state.connect("game_ended", self, "_on_game_ended") - game_state.connect("game_error", self, "_on_game_error") - -func _on_host_pressed(): - if (get_node("connect/name").text == ""): - get_node("connect/error_label").text="Invalid name!" - return - - get_node("connect").hide() - get_node("players").show() - get_node("connect/error_label").text="" - - var player_name = get_node("connect/name").text - var player_color = get_node("connect/color").color - game_state.host_game(player_name, player_color) - refresh_lobby() - -func _on_join_pressed(): - if (get_node("connect/name").text == ""): - get_node("connect/error_label").text="Invalid name!" - return - - var ip = get_node("connect/ip").text - if (not ip.is_valid_ip_address()): - get_node("connect/error_label").text="Invalid IPv4 address!" - return - - get_node("connect/error_label").text="" - get_node("connect/host").disabled=true - get_node("connect/join").disabled=true - - var player_name = get_node("connect/name").text - var player_color = get_node("connect/color").color - game_state.join_game(ip, player_name, player_color) - # refresh_lobby() gets called by the player_list_changed signal - -func _on_connection_success(): - get_node("connect").hide() - get_node("players").show() - -func _on_connection_failed(): - get_node("connect/host").disabled=false - get_node("connect/join").disabled=false - get_node("connect/error_label").set_text("Connection failed.") - -func _on_game_ended(): - show() - get_node("connect").show() - get_node("players").hide() - get_node("connect/host").disabled=false - get_node("connect/join").disabled=false - -func _on_game_error(errtxt): - get_node("error").dialog_text = errtxt - get_node("error").popup_centered_minsize() - -func refresh_lobby(): - var players = game_state.get_player_list() - players.sort() - get_node("players/list").clear() - get_node("players/list").add_item(game_state.get_player_name() + " (You)") - get_node("players/list").set_item_custom_bg_color(get_node("players/list").get_item_count()-1, game_state.get_player_color()) - for p in players: - get_node("players/list").add_item(p.name) - get_node("players/list").set_item_custom_bg_color(get_node("players/list").get_item_count()-1, p.color) - - get_node("players/start").disabled=not get_tree().is_network_server() - -func _on_start_pressed(): - game_state.begin_game() - -func _on_quick_pressed(): - var player_name = get_node("connect/name").text - var player_color = get_node("connect/color").color - game_state.host_game(player_name, player_color) - game_state.begin_game() diff --git a/scripts/menu/direct_host.gd b/scripts/menu/direct_host.gd index fac7ecd..baaf6f4 100644 --- a/scripts/menu/direct_host.gd +++ b/scripts/menu/direct_host.gd @@ -4,14 +4,18 @@ var lobby_menu_scene = preload("res://scenes/menu/lobby.tscn") func _on_host_pressed(): var port = get_node("menu/port").text - game.host_game(int(port)) + var err = game.host_game(int(port)) - var lobby_menu = lobby_menu_scene.instance() - get_tree().get_root().add_child(lobby_menu) - - game.set_player(get_tree().get_network_unique_id()) - - queue_free() + if err == OK: + var lobby_menu = lobby_menu_scene.instance() + get_tree().get_root().add_child(lobby_menu) + + game.set_player(get_tree().get_network_unique_id()) + + queue_free() + else: + _on_back_pressed() + get_tree().get_root().get_node("server").show_error_dialog("Cannot create Server!") func _on_back_pressed(): queue_free() diff --git a/scripts/menu/direct_join.gd b/scripts/menu/direct_join.gd index 16d56ea..0fa8435 100644 --- a/scripts/menu/direct_join.gd +++ b/scripts/menu/direct_join.gd @@ -10,7 +10,7 @@ func _on_join_pressed(): var ip = get_node("menu/ip").text if not ip.is_valid_ip_address(): - get_node("menu/error").text="Invalid IPv4 address!" + show_error_dialog("Invalid IPv4 address!") return var port = get_node("menu/port").text @@ -22,9 +22,13 @@ func _connection_succeeded(): queue_free() func _connection_failed(): - get_node("menu/error").text="Connection failed!" + show_error_dialog("Connection failed!") func _on_back_pressed(): queue_free() get_tree().get_root().get_node("server").show() +func show_error_dialog(text:String): + var dialog = get_node("error_dialog") + dialog.set_text(text) + dialog.popup_centered() \ No newline at end of file diff --git a/scripts/menu/lobby.gd b/scripts/menu/lobby.gd index 10f8b75..b543d9a 100644 --- a/scripts/menu/lobby.gd +++ b/scripts/menu/lobby.gd @@ -1,15 +1,23 @@ extends Control onready var countdown_timer = get_node("countdown_timer") -onready var settings = get_node("menu/settings") +onready var player_settings = get_node("menu/player_settings") onready var player_list = get_node("menu/players") func _ready(): + get_node("menu/back").connect("pressed",self,"_on_back_pressed") + game.connect("players_changed", self, "_players_changed") game.connect("game_ready", self, "_game_ready") game.connect("game_started", self, "_game_started") game.connect("server_disconnected", self, "_server_disconnected") - + + player_settings.get_name_node().connect("text_changed",self,"_on_name_text_changed") + player_settings.get_color_node().connect("color_changed",self,"_on_color_color_changed") + player_settings.get_color_node().connect("draw",self,"_on_player_changed") + + countdown_timer.set_wait_time(game.LOBBY_READY_WAIT_TIME) + func _physics_process(delta): if not countdown_timer.is_stopped(): get_node("countdown").text = str(int(countdown_timer.get_time_left()) + 1) @@ -37,7 +45,6 @@ func _game_ready(all_ready): get_node("countdown").hide() func _game_started(): - hide() queue_free() func _on_name_text_changed(new_text): @@ -48,26 +55,23 @@ func _on_color_color_changed(color): func _on_ready_toggled(button_pressed): _on_player_changed() - settings.get_node("name").set_editable(not button_pressed) - settings.get_node("color").set_disabled(button_pressed) + player_settings.get_name_node().set_editable(not button_pressed) + player_settings.get_color_node().set_disabled(button_pressed) func _on_player_changed(): - var name = settings.get_node("name").text - var color = settings.get_node("color").color + var name = player_settings.get_name_node().text + var color = player_settings.get_color_node().color var ready = get_node("menu/ready").pressed game.update_player(name,color,ready) func _on_back_pressed(): game.quit_game() - queue_free() if get_tree().get_root().has_node("server"): get_tree().get_root().get_node("server").show() + get_tree().get_root().get_node("main_menu").hide() elif get_tree().get_root().has_node("main_menu"): get_tree().get_root().get_node("main_menu").show() + queue_free() func _server_disconnected(): - get_node("disconnected_dialog").set_exclusive(true) - get_node("disconnected_dialog").popup_centered() - -func _on_disconnected_dialog_popup_hide(): _on_back_pressed() diff --git a/scripts/menu/local_game.gd b/scripts/menu/local_game.gd index e40da08..cfe1a94 100644 --- a/scripts/menu/local_game.gd +++ b/scripts/menu/local_game.gd @@ -1,14 +1,14 @@ extends Control -onready var settings = get_node("menu/settings") +onready var player_settings = get_node("menu/player_settings") func _ready(): - pass + get_node("menu/bots").set_pressed(local_storage.read_value("bots", true)) func _on_start_pressed(): - var name = settings.get_node("name").text - var color = settings.get_node("color").color - var bots = get_node("menu/bots").pressed + var name = player_settings.get_name_node().text + var color = player_settings.get_color_node().color + var bots = get_node("menu/bots").is_pressed() queue_free() game.local_game(name,color,bots) diff --git a/scripts/menu/main.gd b/scripts/menu/main.gd index c9aea34..733039c 100644 --- a/scripts/menu/main.gd +++ b/scripts/menu/main.gd @@ -3,7 +3,11 @@ extends Control var server_menu_scene = preload("res://scenes/menu/server.tscn") var local_menu_scene = preload("res://scenes/menu/local_game.tscn") var lobby_menu_scene = preload("res://scenes/menu/lobby.tscn") +var settings_menu_scene = preload("res://scenes/menu/settings.tscn") +func _ready(): + game.connect("server_disconnected", self, "_server_disconnected") + func _on_online_pressed(): var server_menu = server_menu_scene.instance() get_tree().get_root().add_child(server_menu) @@ -15,13 +19,19 @@ func _on_practice_pressed(): hide() func _on_settings_pressed(): - pass + var settings_menu = settings_menu_scene.instance() + get_tree().get_root().add_child(settings_menu) + hide() func _on_quit_pressed(): get_tree().quit() func _on_quick_host_pressed(): - game.host_game(8128) + var err = game.host_game(8128) + if err != OK: + show_error_dialog("Cannot create Server!") + return + var lobby_menu = lobby_menu_scene.instance() get_tree().get_root().add_child(lobby_menu) game.set_player(get_tree().get_network_unique_id()) @@ -29,9 +39,21 @@ func _on_quick_host_pressed(): func _on_quick_join_pressed(): game.connect("connection_succeeded", self, "_quick_connection_succeeded") + game.connect("connection_failed", self, "_quick_connection_failed") game.join_game("127.0.0.1", 8128) func _quick_connection_succeeded(): var lobby_menu = lobby_menu_scene.instance() get_tree().get_root().add_child(lobby_menu) - hide() \ No newline at end of file + hide() + +func _quick_connection_failed(): + show_error_dialog("Connection failed!") + +func _server_disconnected(): + show_error_dialog("Server disconnected!") + +func show_error_dialog(text:String): + var dialog = get_node("error_dialog") + dialog.set_text(text) + dialog.popup_centered() \ No newline at end of file diff --git a/scripts/menu/player_settings.gd b/scripts/menu/player_settings.gd index 90f9b3d..13379aa 100644 --- a/scripts/menu/player_settings.gd +++ b/scripts/menu/player_settings.gd @@ -1,5 +1,15 @@ extends Control func _ready(): - # TODO color - pass + var values = local_storage.read_values() + if values.has('player_name'): + get_name_node().set_text(values['player_name']) + if values.has('player_color'): + get_color_node().set_pick_color(Color(values['player_color'])) + +func get_name_node(): + return get_node("name") + +func get_color_node(): + return get_node("color") + \ No newline at end of file diff --git a/scripts/menu/server.gd b/scripts/menu/server.gd index cb70352..41d6289 100644 --- a/scripts/menu/server.gd +++ b/scripts/menu/server.gd @@ -1,11 +1,11 @@ extends Control - var direct_host_menu_scene = preload("res://scenes/menu/direct_host.tscn") var direct_join_menu_scene = preload("res://scenes/menu/direct_join.tscn") func _ready(): - pass + get_node("menu/back").connect("pressed",self,"_on_back_pressed") + game.connect("server_disconnected", self, "_server_disconnected") func _on_back_pressed(): queue_free() @@ -17,9 +17,16 @@ func _on_direct_host_pressed(): get_tree().get_root().get_node("main_menu").hide() hide() - func _on_direct_join_pressed(): var direct_join_menu = direct_join_menu_scene.instance() get_tree().get_root().add_child(direct_join_menu) get_tree().get_root().get_node("main_menu").hide() hide() + +func _server_disconnected(): + show_error_dialog("Server disconnected!") + +func show_error_dialog(text:String): + var dialog = get_node("error_dialog") + dialog.set_text(text) + dialog.popup_centered() \ No newline at end of file diff --git a/scripts/menu/settings.gd b/scripts/menu/settings.gd new file mode 100644 index 0000000..904f8f1 --- /dev/null +++ b/scripts/menu/settings.gd @@ -0,0 +1,22 @@ +extends Control + +onready var player_settings = get_node("menu/tabs/Game/player_settings") + + +func _ready(): + get_node("menu/back").connect("pressed",self,"_on_back_pressed") + get_node("menu/tabs/Game/bots").set_pressed(local_storage.read_value("bots", true)) + +func _on_back_pressed(): + queue_free() + get_tree().get_root().get_node("main_menu").show() + +func _on_save_pressed(): + var values = {} + values['player_name'] = player_settings.get_name_node().text + values['player_color'] = player_settings.get_color_node().color.to_html() + values['bots'] = get_node("menu/tabs/Game/bots").is_pressed() + local_storage.write_values(values) + _on_back_pressed() + + diff --git a/scripts/player/HumanControls.gd b/scripts/player/HumanControls.gd index 013ad19..768c583 100644 --- a/scripts/player/HumanControls.gd +++ b/scripts/player/HumanControls.gd @@ -18,9 +18,11 @@ func _physics_process(delta): else: if Input.is_action_pressed("ui_up") && player.current_speed <= player.MAX_SPEED: player.current_speed += player.speed_factor + elif Input.is_action_pressed("ui_down") && player.current_speed <= player.MAX_SPEED: + player.current_speed -= player.speed_factor elif player.current_speed > 0: player.current_speed -= player.speed_factor * player.brake_factor - if player.current_speed < 0: + elif player.current_speed < 0: player.current_speed = 0 get_node("hud/speed").set_text(str(player.current_speed)) diff --git a/scripts/player/Player.gd b/scripts/player/Player.gd index 807de2c..2a8e02c 100644 --- a/scripts/player/Player.gd +++ b/scripts/player/Player.gd @@ -40,6 +40,9 @@ func _physics_process(delta): follow.set_offset(follow.get_offset() + current_speed) + if follow.get_offset() < 0: + follow.set_offset(0) + # curve if has_next && (path.curve.get_point_count() == 0 || follow.get_unit_offset() >= 1.0): has_next = false diff --git a/scripts/player/raceCar.gd b/scripts/player/raceCar.gd index 8e15c2d..bf814af 100644 --- a/scripts/player/raceCar.gd +++ b/scripts/player/raceCar.gd @@ -12,7 +12,7 @@ func _ready(): road_ray = get_node("ray") func _physics_process(delta): - if (is_network_master()): + if is_network_master(): if road_ray.is_colliding(): if road_ray.get_collider() != collider: var parent = road_ray.get_collider().get_parent()