Browse Source

menus menus menus, network logic, dedicated server logic

Lurkars 6 years ago
parent
commit
b4a39b7c12
  1. 2
      project.godot
  2. 160
      scenes/lobby/lobby_old.tscn
  3. 29
      scenes/menu/base_menu.tscn
  4. 38
      scenes/menu/direct_host.tscn
  5. 26
      scenes/menu/direct_join.tscn
  6. 120
      scenes/menu/lobby.tscn
  7. 28
      scenes/menu/local_game.tscn
  8. 5
      scenes/menu/main.tscn
  9. 2
      scenes/menu/player_settings.tscn
  10. 70
      scenes/menu/server.tscn
  11. 72
      scenes/menu/settings.tscn
  12. 6
      scenes/player/HumanPlayer.tscn
  13. 114
      scripts/game/game.gd
  14. 203
      scripts/game/game_state.gd
  15. 45
      scripts/game/local_storage.gd
  16. 2
      scripts/game/route.gd
  17. 5
      scripts/game/server.gd
  18. 8
      scripts/game/world.gd
  19. 83
      scripts/lobby/lobby.gd
  20. 18
      scripts/menu/direct_host.gd
  21. 8
      scripts/menu/direct_join.gd
  22. 28
      scripts/menu/lobby.gd
  23. 10
      scripts/menu/local_game.gd
  24. 28
      scripts/menu/main.gd
  25. 14
      scripts/menu/player_settings.gd
  26. 13
      scripts/menu/server.gd
  27. 22
      scripts/menu/settings.gd
  28. 4
      scripts/player/HumanControls.gd
  29. 3
      scripts/player/Player.gd
  30. 2
      scripts/player/raceCar.gd

2
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]

160
scenes/lobby/lobby_old.tscn

@ -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"]

29
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

38
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"]

26
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"]

120
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"]

28
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

5
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"]

2
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

70
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"]

72
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"]

6
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 )

114
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

203
scripts/game/game_state.gd

@ -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")

45
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()

2
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))

5
scripts/game/server.gd

@ -1,5 +0,0 @@
extends Node
func _ready():
pass # Replace with function body.

8
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)

83
scripts/lobby/lobby.gd

@ -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()

18
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()

8
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()

28
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()

10
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)

28
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()
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()

14
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")

13
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()

22
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()

4
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))

3
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

2
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()

Loading…
Cancel
Save