Browse Source

fixed player count

Lurkars 6 years ago
parent
commit
4e7fe7a26c
  1. 8
      default_env.tres
  2. 30
      project.godot
  3. 4
      resources/lanes/start/1.tres
  4. 4
      resources/lanes/start/2.tres
  5. 4
      resources/lanes/start/3.tres
  6. 4
      resources/lanes/start/4.tres
  7. BIN
      resources/ui/i18n.de.translation
  8. BIN
      resources/ui/i18n.en.translation
  9. 8
      scenes/game/Game.tscn
  10. 8
      scenes/menus/DirectHostMenu.tscn
  11. 13
      scenes/menus/DirectJoinMenu.tscn
  12. 2
      scenes/menus/MainMenu.tscn
  13. 1
      scenes/player/HumanPlayer.tscn
  14. 10
      scenes/player/Player.tscn
  15. 5
      scenes/road/roadBump.tscn
  16. 4
      scenes/road/roadCornerLarge.tscn
  17. 5
      scenes/road/roadCornerLargeFlipped.tscn
  18. 5
      scenes/road/roadCornerLarger.tscn
  19. 5
      scenes/road/roadCornerLargerFlipped.tscn
  20. 6
      scenes/road/roadCornerSmall.tscn
  21. 6
      scenes/road/roadCornerSmallFlipped.tscn
  22. 11
      scenes/road/roadCurved.tscn
  23. 11
      scenes/road/roadCurvedFlipped.tscn
  24. 6
      scenes/road/roadLoop.tscn
  25. 3
      scenes/road/roadRamp.tscn
  26. 2
      scenes/road/roadRampFlipped.tscn
  27. 3
      scenes/road/roadRampLong.tscn
  28. 3
      scenes/road/roadRampLongCurved.tscn
  29. 2
      scenes/road/roadRampLongCurvedFlipped.tscn
  30. 2
      scenes/road/roadRampLongFlipped.tscn
  31. 2
      scenes/road/roadStraight.tscn
  32. 2
      scenes/road/roadStraightLong.tscn
  33. 9
      scenes/road/roadStraightLongBump.tscn
  34. 5
      scenes/road/roadStraightSkew.tscn
  35. 5
      scenes/road/roadStraightSkewFlipped.tscn
  36. 170
      scripts/game/game.gd
  37. 152
      scripts/game/gamestate.gd
  38. 6
      scripts/game/local_storage.gd
  39. 8
      scripts/game/route.gd
  40. 59
      scripts/game/world.gd
  41. 4
      scripts/menus/direct_host.gd
  42. 17
      scripts/menus/direct_join.gd
  43. 2
      scripts/menus/ingame.gd
  44. 18
      scripts/menus/lobby.gd
  45. 2
      scripts/menus/main.gd
  46. 2
      scripts/menus/server.gd
  47. 2
      scripts/menus/server_create.gd
  48. 8
      scripts/networking/client.gd
  49. 4
      scripts/networking/game_server.gd
  50. 49
      scripts/networking/server.gd
  51. 10
      scripts/player/base_inventory.gd
  52. 46
      scripts/player/base_player.gd
  53. 46
      scripts/player/bot_controls.gd
  54. 2
      scripts/player/bot_inventory.gd
  55. 4
      scripts/player/human_controls.gd
  56. 3
      scripts/player/human_inventory.gd
  57. 10
      scripts/player/inventory_preview.gd
  58. 101
      scripts/player/player.gd
  59. 4
      scripts/player/race_car.gd
  60. 27
      scripts/road/road.gd
  61. 1
      scripts/road/roads_factory.gd

8
default_env.tres

@ -1,9 +1,15 @@
[gd_resource type="Environment" load_steps=2 format=2] [gd_resource type="Environment" load_steps=2 format=2]
[sub_resource type="ProceduralSky" id=1] [sub_resource type="ProceduralSky" id=1]
sky_top_color = Color( 1, 0.945098, 0.65098, 1 )
sky_horizon_color = Color( 0.984314, 0.956863, 0.898039, 1 )
ground_bottom_color = Color( 0, 0, 0, 1 )
ground_horizon_color = Color( 0.321569, 0.321569, 0.321569, 1 )
ground_curve = 0.00594603
sun_color = Color( 0.980392, 0.815686, 0.376471, 1 )
[resource] [resource]
background_mode = 2 background_mode = 2
background_sky = SubResource( 1 ) background_sky = SubResource( 1 )
ambient_light_color = Color( 1, 1, 1, 1 )
ambient_light_color = Color( 1, 0.980392, 0.929412, 1 )
ambient_light_sky_contribution = 0.0 ambient_light_sky_contribution = 0.0

30
project.godot

@ -14,10 +14,10 @@ _global_script_classes=[ {
"language": "GDScript", "language": "GDScript",
"path": "res://scripts/player/base_inventory.gd" "path": "res://scripts/player/base_inventory.gd"
}, { }, {
"base": "Node",
"class": "BasePlayer",
"base": "Spatial",
"class": "Game",
"language": "GDScript", "language": "GDScript",
"path": "res://scripts/player/base_player.gd"
"path": "res://scripts/game/game.gd"
}, { }, {
"base": "Spatial", "base": "Spatial",
"class": "GameServer", "class": "GameServer",
@ -29,7 +29,7 @@ _global_script_classes=[ {
"language": "GDScript", "language": "GDScript",
"path": "res://scripts/networking/game_server_requests.gd" "path": "res://scripts/networking/game_server_requests.gd"
}, { }, {
"base": "BasePlayer",
"base": "Node",
"class": "Player", "class": "Player",
"language": "GDScript", "language": "GDScript",
"path": "res://scripts/player/player.gd" "path": "res://scripts/player/player.gd"
@ -61,7 +61,7 @@ _global_script_classes=[ {
} ] } ]
_global_script_class_icons={ _global_script_class_icons={
"BaseInventory": "", "BaseInventory": "",
"BasePlayer": "",
"Game": "",
"GameServer": "", "GameServer": "",
"GameServerRequests": "", "GameServerRequests": "",
"Player": "", "Player": "",
@ -81,7 +81,7 @@ config/icon="res://icon.png"
[autoload] [autoload]
game="*res://scripts/game/game.gd"
gamestate="*res://scripts/game/gamestate.gd"
client="*res://scripts/networking/client.gd" client="*res://scripts/networking/client.gd"
server="*res://scripts/networking/server.gd" server="*res://scripts/networking/server.gd"
game_server="*res://scripts/networking/game_server.gd" game_server="*res://scripts/networking/game_server.gd"
@ -89,13 +89,6 @@ roads_factory="*res://scripts/road/roads_factory.gd"
local_storage="*res://scripts/game/local_storage.gd" local_storage="*res://scripts/game/local_storage.gd"
Util="*res://scripts/Util.gd" Util="*res://scripts/Util.gd"
[display]
window/size/width=1920
window/size/height=1080
window/size/resizable=false
window/size/fullscreen=true
[input] [input]
ui_cancel={ ui_cancel={
@ -175,12 +168,11 @@ debug_camera_4={
[layer_names] [layer_names]
3d_physics/layer_1="basic"
3d_physics/layer_2="player_1"
3d_physics/layer_3="player_2"
3d_physics/layer_4="player_3"
3d_physics/layer_5="player_4"
3d_physics/layer_6="preview"
3d_physics/layer_1="player_1"
3d_physics/layer_2="player_2"
3d_physics/layer_3="player_3"
3d_physics/layer_4="player_4"
3d_physics/layer_5="preview"
[locale] [locale]

4
resources/lanes/start/1.tres

@ -2,6 +2,6 @@
[resource] [resource]
_data = { _data = {
"points": PoolVector3Array( 0, 0, 0, 0, 0, 1.14889, -0.08757, 0, 1.70223, 0, 0, -1.14889, 0, 0, 0, 0, 0, 4 ),
"tilts": PoolRealArray( 0, 0 )
"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.14889, -0.08757, 0, 1.70223, 0, 0, -1.14889, 0, 0, 0, 0, 0, 4 ),
"tilts": PoolRealArray( 0, 0, 1.13505e-43 )
} }

4
resources/lanes/start/2.tres

@ -2,6 +2,6 @@
[resource] [resource]
_data = { _data = {
"points": PoolVector3Array( 0, 0, 0, 0, 0, 1.91243, 0.08757, 0, 1.20223, 0, 0, -1.91243, 0, 0, 0, 0, 0, 4 ),
"tilts": PoolRealArray( 0, 0 )
"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.91243, 0.08757, 0, 1.20223, 0, 0, -1.91243, 0, 0, 0, 0, 0, 4 ),
"tilts": PoolRealArray( 0, 0, 1.13505e-43 )
} }

4
resources/lanes/start/3.tres

@ -2,6 +2,6 @@
[resource] [resource]
_data = { _data = {
"points": PoolVector3Array( 0, 0, 0, 0, 0, 1.78621, 0.0824, 0, 0.702227, 0, 0, -1.78621, 0, 0, 0, 0, 0, 4 ),
"tilts": PoolRealArray( 0, 0 )
"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.78621, 0.0824, 0, 0.702227, 0, 0, -1.78621, 0, 0, 0, 0, 0, 4 ),
"tilts": PoolRealArray( 0, 0, 1.13505e-43 )
} }

4
resources/lanes/start/4.tres

@ -2,6 +2,6 @@
[resource] [resource]
_data = { _data = {
"points": PoolVector3Array( 0, 0, 0, 0, 0, 1.79777, -0.0824, 0, 0.202227, 0, 0, -1.79777, 0, 0, 0, 0, 0, 4 ),
"tilts": PoolRealArray( 0, 0 )
"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.79777, -0.0824, 0, 0.202227, 0, 0, -1.79777, 0, 0, 0, 0, 0, 4 ),
"tilts": PoolRealArray( 0, 0, 1.13505e-43 )
} }

BIN
resources/ui/i18n.de.translation

BIN
resources/ui/i18n.en.translation

8
scenes/game/World.tscn → scenes/game/Game.tscn

@ -1,9 +1,9 @@
[gd_scene load_steps=3 format=2] [gd_scene load_steps=3 format=2]
[ext_resource path="res://scripts/game/world.gd" type="Script" id=1]
[ext_resource path="res://scripts/game/game.gd" type="Script" id=1]
[ext_resource path="res://scripts/game/route.gd" type="Script" id=2] [ext_resource path="res://scripts/game/route.gd" type="Script" id=2]
[node name="world" type="Spatial"]
[node name="game" type="Spatial"]
script = ExtResource( 1 ) script = ExtResource( 1 )
[node name="route" type="Spatial" parent="."] [node name="route" type="Spatial" parent="."]
@ -12,8 +12,8 @@ script = ExtResource( 2 )
[node name="players" type="Spatial" parent="."] [node name="players" type="Spatial" parent="."]
[node name="sun" type="DirectionalLight" parent="."] [node name="sun" type="DirectionalLight" parent="."]
transform = Transform( 0.324827, 0.775291, 0.541675, -0.754407, -0.133022, 0.642788, 0.570402, -0.617438, 0.541675, 0, 100, 0 )
transform = Transform( 0.324827, 0.775291, 0.541675, -0.754407, -0.133022, 0.642788, 0.570402, -0.617438, 0.541675, 0, 0, 0 )
visible = false visible = false
light_energy = 5.0
light_color = Color( 0.921569, 0.741176, 0.368627, 1 )
directional_shadow_mode = 1 directional_shadow_mode = 1
directional_shadow_max_distance = 25.0 directional_shadow_max_distance = 25.0

8
scenes/menus/DirectHostMenu.tscn

@ -43,15 +43,16 @@ margin_right = 65.0
margin_bottom = 33.0 margin_bottom = 33.0
text = "PORT" text = "PORT"
[node name="port" type="LineEdit" parent="menu/GridContainer"]
[node name="port" type="SpinBox" parent="menu/GridContainer"]
margin_left = 69.0 margin_left = 69.0
margin_right = 266.0 margin_right = 266.0
margin_bottom = 40.0 margin_bottom = 40.0
focus_neighbour_right = NodePath("../bots") focus_neighbour_right = NodePath("../bots")
focus_neighbour_bottom = NodePath("../../back") focus_neighbour_bottom = NodePath("../../back")
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "8128"
max_length = 5
max_value = 65535.0
value = 8128.0
align = 2
[node name="bots" type="CheckButton" parent="menu/GridContainer"] [node name="bots" type="CheckButton" parent="menu/GridContainer"]
margin_left = 270.0 margin_left = 270.0
@ -90,6 +91,5 @@ custom_fonts/font = ExtResource( 3 )
text = "BACK" text = "BACK"
icon = ExtResource( 5 ) icon = ExtResource( 5 )
flat = true flat = true
[connection signal="text_changed" from="menu/GridContainer/port" to="." method="_on_port_text_changed"]
[connection signal="pressed" from="menu/host" to="." method="_on_host_pressed"] [connection signal="pressed" from="menu/host" to="." method="_on_host_pressed"]
[connection signal="pressed" from="menu/back" to="." method="_on_back_pressed"] [connection signal="pressed" from="menu/back" to="." method="_on_back_pressed"]

13
scenes/menus/DirectJoinMenu.tscn

@ -62,17 +62,16 @@ size_flags_vertical = 1
text = "PORT" text = "PORT"
valign = 1 valign = 1
[node name="port" type="LineEdit" parent="menu/GridContainer"]
[node name="port" type="SpinBox" parent="menu/GridContainer"]
margin_left = 69.0 margin_left = 69.0
margin_top = 41.0 margin_top = 41.0
margin_right = 407.0 margin_right = 407.0
margin_bottom = 78.0 margin_bottom = 78.0
focus_neighbour_top = NodePath("../ip") focus_neighbour_top = NodePath("../ip")
focus_neighbour_bottom = NodePath("../../join") focus_neighbour_bottom = NodePath("../../join")
text = "8128"
max_length = 5
caret_blink = true
caret_blink_speed = 0.5
max_value = 65535.0
value = 8128.0
align = 2
[node name="join" type="Button" parent="menu"] [node name="join" type="Button" parent="menu"]
anchor_left = 1.0 anchor_left = 1.0
@ -103,9 +102,5 @@ custom_fonts/font = ExtResource( 3 )
text = "BACK" text = "BACK"
icon = ExtResource( 5 ) icon = ExtResource( 5 )
flat = true flat = true
[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/join" to="." method="_on_join_pressed"]
[connection signal="pressed" from="menu/back" to="." method="_on_back_pressed"] [connection signal="pressed" from="menu/back" to="." method="_on_back_pressed"]

2
scenes/menus/MainMenu.tscn

@ -83,8 +83,8 @@ margin_right = 138.0
margin_bottom = 84.0 margin_bottom = 84.0
window_title = "ALERT" window_title = "ALERT"
dialog_text = "Server disconnected!" dialog_text = "Server disconnected!"
[connection signal="pressed" from="menu/GridContainer/multiplayer" to="." method="_on_online_pressed"]
[connection signal="pressed" from="menu/GridContainer/multiplayer" to="." method="_on_multiplayer_pressed"] [connection signal="pressed" from="menu/GridContainer/multiplayer" to="." method="_on_multiplayer_pressed"]
[connection signal="pressed" from="menu/GridContainer/multiplayer" to="." method="_on_online_pressed"]
[connection signal="pressed" from="menu/GridContainer/practice" to="." method="_on_practice_pressed"] [connection signal="pressed" from="menu/GridContainer/practice" to="." method="_on_practice_pressed"]
[connection signal="pressed" from="menu/GridContainer/settings" to="." method="_on_settings_pressed"] [connection signal="pressed" from="menu/GridContainer/settings" to="." method="_on_settings_pressed"]
[connection signal="pressed" from="menu/GridContainer/quit" to="." method="_on_quit_pressed"] [connection signal="pressed" from="menu/GridContainer/quit" to="." method="_on_quit_pressed"]

1
scenes/player/HumanPlayer.tscn

@ -90,7 +90,6 @@ uppercase = true
visible = false visible = false
[node name="inventory" type="Spatial" parent="."] [node name="inventory" type="Spatial" parent="."]
editor/display_folded = true
script = ExtResource( 5 ) script = ExtResource( 5 )
[node name="viewport" type="Viewport" parent="inventory"] [node name="viewport" type="Viewport" parent="inventory"]

10
scenes/player/Player.tscn

@ -30,11 +30,10 @@ v_offset = 0.015
rotation_mode = 4 rotation_mode = 4
loop = false loop = false
[node name="raceCar" type="RigidBody" parent="Path/PathFollow"]
mass = 40.0
axis_lock_angular_x = true
axis_lock_angular_y = true
axis_lock_angular_z = true
[node name="raceCar" type="KinematicBody" parent="Path/PathFollow"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
collision_layer = 31
collision_mask = 31
script = ExtResource( 2 ) script = ExtResource( 2 )
[node name="body" type="MeshInstance" parent="Path/PathFollow/raceCar"] [node name="body" type="MeshInstance" parent="Path/PathFollow/raceCar"]
@ -79,6 +78,7 @@ transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0.3,
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0.2 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0.2 )
enabled = true enabled = true
cast_to = Vector3( 0, -0.2, 0 ) cast_to = Vector3( 0, -0.2, 0 )
collision_mask = 0
[node name="ResetTimer" type="Timer" parent="."] [node name="ResetTimer" type="Timer" parent="."]
wait_time = 3.0 wait_time = 3.0

5
scenes/road/roadBump.tscn

@ -12,8 +12,9 @@ material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
reset_index = 1 reset_index = 1
speed_constrains = PoolVector3Array( 0.45, 0.8, 0.09, 0.45, 0.8, -0.02, 1.15, 1.55, 0.09 )
force_penalties = PoolVector3Array( 0, 30, 20, 0, 0, -30, 0, 20, 20 )
speed_constrains = PoolVector3Array( 0.45, 0.8, 0.12, 0.45, 0.8, -0.02, 1.15, 1.55, 0.12 )
force_penalties = PoolVector3Array( 0, 5, 10, 0, 0, 0, 0, 0, 7 )
path_penalties = [ 0.0, 0.5 ]
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

4
scenes/road/roadCornerLarge.tscn

@ -12,8 +12,8 @@ material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
end_rotation = Vector3( 0, -1.571, 0 ) end_rotation = Vector3( 0, -1.571, 0 )
speed_constrains = PoolVector3Array( 0.2, 0.6, 0.13, 0.6, 1.5, 0.1, 1.5, 2.36, 0.13 ) speed_constrains = PoolVector3Array( 0.2, 0.6, 0.13, 0.6, 1.5, 0.1, 1.5, 2.36, 0.13 )
force_penalties = PoolVector3Array( 0, 0, 50 )
torque_penalties = PoolVector3Array( 0, 0, 2 )
force_penalties = PoolVector3Array( 2, 0, 8 )
torque_penalties = PoolVector3Array( 0.5, 0.1, 0.1 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

5
scenes/road/roadCornerLargeFlipped.tscn

@ -11,10 +11,9 @@ material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
end_rotation = Vector3( 0, 1.571, 0 ) end_rotation = Vector3( 0, 1.571, 0 )
end_rotation_phi = 1.571
speed_constrains = PoolVector3Array( 0.2, 0.6, 0.13, 0.6, 1.5, 0.1, 1.5, 2.36, 0.13 ) speed_constrains = PoolVector3Array( 0.2, 0.6, 0.13, 0.6, 1.5, 0.1, 1.5, 2.36, 0.13 )
force_penalties = PoolVector3Array( 0, 0, 50 )
torque_penalties = PoolVector3Array( 0, 0, -2 )
force_penalties = PoolVector3Array( 1, 0, 5 )
torque_penalties = PoolVector3Array( 0, 1, 1.5 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

5
scenes/road/roadCornerLarger.tscn

@ -11,10 +11,9 @@ material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
end_rotation = Vector3( 0, -1.571, 0 ) end_rotation = Vector3( 0, -1.571, 0 )
end_rotation_phi = -1.571
speed_constrains = PoolVector3Array( 0.3, 1, 0.16, 1, 2.7, 0.13, 2.7, 3.93, 0.16 ) speed_constrains = PoolVector3Array( 0.3, 1, 0.16, 1, 2.7, 0.13, 2.7, 3.93, 0.16 )
force_penalties = PoolVector3Array( 0, 0, 50 )
torque_penalties = PoolVector3Array( 0, 0, 2 )
force_penalties = PoolVector3Array( 0, 0, 5 )
torque_penalties = PoolVector3Array( 0, 0, 1 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

5
scenes/road/roadCornerLargerFlipped.tscn

@ -11,10 +11,9 @@ material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
end_rotation = Vector3( 0, 1.571, 0 ) end_rotation = Vector3( 0, 1.571, 0 )
end_rotation_phi = 1.571
speed_constrains = PoolVector3Array( 0.3, 1, 0.16, 1, 2.7, 0.13, 2.7, 3.93, 0.16 ) speed_constrains = PoolVector3Array( 0.3, 1, 0.16, 1, 2.7, 0.13, 2.7, 3.93, 0.16 )
force_penalties = PoolVector3Array( 0, 0, 50 )
torque_penalties = PoolVector3Array( 0, 0, -2 )
force_penalties = PoolVector3Array( 0, 0, 5 )
torque_penalties = PoolVector3Array( 0, 0, -1 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

6
scenes/road/roadCornerSmall.tscn

@ -11,9 +11,9 @@ material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
end_rotation = Vector3( 0, -1.571, 0 ) end_rotation = Vector3( 0, -1.571, 0 )
speed_constrains = PoolVector3Array( 0.1, 0.79, 0.07 )
force_penalties = PoolVector3Array( 0, 0, 50 )
torque_penalties = PoolVector3Array( 0, 0, 2 )
speed_constrains = PoolVector3Array( 0.1, 0.79, 0.08 )
force_penalties = PoolVector3Array( 0, 0, 5 )
torque_penalties = PoolVector3Array( 0, 0, 1 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

6
scenes/road/roadCornerSmallFlipped.tscn

@ -11,9 +11,9 @@ material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
end_rotation = Vector3( 0, 1.571, 0 ) end_rotation = Vector3( 0, 1.571, 0 )
speed_constrains = PoolVector3Array( 0.1, 0.79, 0.07 )
force_penalties = PoolVector3Array( 0, 0, 50 )
torque_penalties = PoolVector3Array( 0, 0, -2 )
speed_constrains = PoolVector3Array( 0.1, 0.79, 0.08 )
force_penalties = PoolVector3Array( 0, 0, 5 )
torque_penalties = PoolVector3Array( 0, 0, -1 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

11
scenes/road/roadCurved.tscn

@ -1,13 +1,18 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://assets/road/roadCurved.obj" type="ArrayMesh" id=1] [ext_resource path="res://assets/road/roadCurved.obj" type="ArrayMesh" id=1]
[ext_resource path="res://resources/road/roadCurved.tres" type="Curve3D" id=2]
[ext_resource path="res://scripts/road/road.gd" type="Script" id=2]
[ext_resource path="res://resources/road/roadCurved.tres" type="Curve3D" id=3]
[node name="roadCurved" type="MeshInstance"] [node name="roadCurved" type="MeshInstance"]
mesh = ExtResource( 1 ) mesh = ExtResource( 1 )
material/0 = null material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 )
speed_constrains = PoolVector3Array( 0, 0.5, 0.14, 1.5, 2, 0.14 )
force_penalties = PoolVector3Array( 0, 0, 4 )
torque_penalties = PoolVector3Array( 0, 0, 2 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 2 )
curve = ExtResource( 3 )

11
scenes/road/roadCurvedFlipped.tscn

@ -1,13 +1,18 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://assets/road/roadCurvedFlipped.obj" type="ArrayMesh" id=1] [ext_resource path="res://assets/road/roadCurvedFlipped.obj" type="ArrayMesh" id=1]
[ext_resource path="res://resources/road/roadCurvedFlipped.tres" type="Curve3D" id=2]
[ext_resource path="res://scripts/road/road.gd" type="Script" id=2]
[ext_resource path="res://resources/road/roadCurvedFlipped.tres" type="Curve3D" id=3]
[node name="roadCurvedFlipped" type="MeshInstance"] [node name="roadCurvedFlipped" type="MeshInstance"]
mesh = ExtResource( 1 ) mesh = ExtResource( 1 )
material/0 = null material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 )
speed_constrains = PoolVector3Array( 0, 0.5, 0.14, 1.5, 2, 0.14 )
force_penalties = PoolVector3Array( 0, 0, 4 )
torque_penalties = PoolVector3Array( 0, 0, 2 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 2 )
curve = ExtResource( 3 )

6
scenes/road/roadLoop.tscn

@ -12,9 +12,9 @@ material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
reset_index = 2 reset_index = 2
speed_constrains = PoolVector3Array( 2.5, 4.8, -0.1, 4.8, 7.6, -0.13 )
force_penalties = PoolVector3Array( 0, 1, -20, 0, -10, -10 )
torque_penalties = PoolVector3Array( 0, 0, 0 )
speed_constrains = PoolVector3Array( 2.5, 4.8, -0.09, 4.8, 7.6, -0.13 )
force_penalties = PoolVector3Array( 0, 0, 0, 0, -1, -0.1 )
path_penalties = [ 5.0 ]
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

3
scenes/road/roadRamp.tscn

@ -10,6 +10,9 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
reset_index = 1
speed_constrains = PoolVector3Array( 0, 1, -0.05 )
path_penalties = [ 1.0 ]
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

2
scenes/road/roadRampFlipped.tscn

@ -10,6 +10,8 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
speed_constrains = PoolVector3Array( 0, 0.3, 0.12 )
force_penalties = PoolVector3Array( 0, 0, 4 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

3
scenes/road/roadRampLong.tscn

@ -10,6 +10,9 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
reset_index = 1
speed_constrains = PoolVector3Array( 0, 2, -0.05 )
path_penalties = [ 2.0 ]
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

3
scenes/road/roadRampLongCurved.tscn

@ -10,6 +10,9 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
reset_index = 1
speed_constrains = PoolVector3Array( 0.25, 1.5, -0.05 )
path_penalties = [ 1.25 ]
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

2
scenes/road/roadRampLongCurvedFlipped.tscn

@ -10,6 +10,8 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
speed_constrains = PoolVector3Array( 0.25, 0.4, 0.12 )
force_penalties = PoolVector3Array( 0, 0, 3.5 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

2
scenes/road/roadRampLongFlipped.tscn

@ -10,6 +10,8 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
speed_constrains = PoolVector3Array( 0, 0.1, 0.12 )
force_penalties = PoolVector3Array( 0, 0, 4 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

2
scenes/road/roadStraight.tscn

@ -10,6 +10,8 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
first_speed_factor = 0.8
creator_speed_factor = 0.8
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

2
scenes/road/roadStraightLong.tscn

@ -10,6 +10,8 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
first_speed_factor = 0.8
creator_speed_factor = 0.8
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

9
scenes/road/roadStraightLongBump.tscn

@ -10,6 +10,15 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
reset_index = 1
speed_constrains = PoolVector3Array( 0.1, 0.8, 0.13, 0.1, 0.8, -0.05, 1.2, 1.6, 0.13 )
force_penalties = PoolVector3Array( 0, 4, 15, 0, 0, 0, 0, 0, 5 )
torque_penalties = PoolVector3Array( 0.2, 0, 0, 0, 0, 0, 0.1, 0, 0 )
path_penalties = [ 0.0, 0.7 ]
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )
[node name="PathFollow" type="PathFollow" parent="Path"]
transform = Transform( 1, 0, 0, 0, 0.743809, -0.668391, 0, 0.668391, 0.743809, 0, 0.100104, 1.55236 )
offset = 1.62

5
scenes/road/roadStraightSkew.tscn

@ -10,6 +10,11 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
first_speed_factor = 0.9
creator_speed_factor = 0.9
speed_constrains = PoolVector3Array( 0, 0.2, 0.14 )
force_penalties = PoolVector3Array( 0, 0, 3 )
torque_penalties = PoolVector3Array( 0, 0, 2 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

5
scenes/road/roadStraightSkewFlipped.tscn

@ -10,6 +10,11 @@ material/0 = null
material/1 = null material/1 = null
material/2 = null material/2 = null
script = ExtResource( 2 ) script = ExtResource( 2 )
first_speed_factor = 0.9
creator_speed_factor = 0.9
speed_constrains = PoolVector3Array( 0, 0.2, 0.14 )
force_penalties = PoolVector3Array( 0, 0, 3 )
torque_penalties = PoolVector3Array( 0, 0, 2 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
curve = ExtResource( 3 ) curve = ExtResource( 3 )

170
scripts/game/game.gd

@ -1,150 +1,50 @@
extends Node
extends Spatial
const MAX_PEERS = 4
const LOBBY_READY_WAIT_TIME = 3
class_name Game
var World = preload("res://scenes/game/World.tscn")
var Player = preload("res://scenes/player/Player.tscn")
var HumanPlayer = preload("res://scenes/player/HumanPlayer.tscn")
var BotPlayer = preload("res://scenes/player/BotPlayer.tscn")
var players:Array
var route:Route
var first:Player
var last:Player
var players = {}
const REMOVE_LAST = 2
var game_name = ""
var bots:bool = false
var game_running:bool = false
signal players_changed(players)
signal game_ready(ready)
signal game_started()
signal game_ended()
func _ready():
route = get_node("route")
if is_network_master():
route.rpc("add_road",roads_factory.START, -1)
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}
emit_signal("players_changed", players)
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, 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
rpc("game_ready", all_ready)
func _physics_process(delta):
if is_network_master():
set_player_order()
check_autotrack()
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:
rpc("set_player",get_tree().get_network_unique_id(), new_name, new_color, new_ready)
func set_player_order():
players = get_node("players").get_children()
players.sort_custom(PlayerSorter,"sort")
if players.size() > 0 && players[0] != first:
new_first(players[0])
if players.size() > 0 && players[players.size()-1] != last:
last = players[players.size()-1]
remotesync func remove_player(id):
players.erase(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)
func new_first(player):
if first != null:
first.rpc("set_first",false)
first = player
first.rpc("set_first",true)
remotesync func game_ready(all_ready:bool):
if get_tree().is_network_server():
if all_ready:
game_running = true
else:
game_running = false
emit_signal("game_ready", all_ready)
func check_autotrack():
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)
remotesync func prepare_game():
get_tree().set_pause(true)
var world = World.instance()
get_tree().get_root().add_child(world)
get_tree().get_root().get_node("main_menu").hide()
for p_id in players:
var controls
var player = players[p_id]
var player_scene = Player.instance()
player_scene.set_network_master(p_id)
player_scene.set_name(str(p_id))
player_scene.set_player_name(player.name)
player_scene.set_player_color(player.color)
world.get_node("players").add_child(player_scene)
if p_id == get_tree().get_network_unique_id():
controls = HumanPlayer.instance()
controls.set_name("HumanControl_" + str(p_id))
world.add_child(controls)
controls.set_player(player_scene.get_path())
controls.set_network_master(p_id)
player_scene.set_start(player_scene.get_index())
if bots:
for index in range(MAX_PEERS-players.size()):
var bot_index = players.size() + index
var player_scene = Player.instance()
player_scene.set_name("bot_player" + str(bot_index))
player_scene.set_player_color(Color(randf(),randf(),randf()))
world.get_node("players").add_child(player_scene)
player_scene.add_to_group("bots")
if get_tree().is_network_server():
var bot = BotPlayer.instance()
bot.set_name("bot" + str(bot_index))
world.add_child(bot)
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())
if get_tree().is_network_server():
if players.has(get_tree().get_network_unique_id()):
player_prepared(get_tree().get_network_unique_id())
else:
rpc_id(1, "player_prepared", get_tree().get_network_unique_id())
remotesync func player_prepared(id):
if get_tree().is_network_server():
players[id].prepared = true
var all_prepared = true
for p_id in players:
all_prepared = all_prepared && players[p_id].prepared
if all_prepared:
rpc("post_start_game")
remotesync func post_start_game():
get_tree().set_pause(false)
emit_signal("game_started")
remotesync func set_bots(has_bots:bool):
bots = has_bots
func quit_game():
if has_node("/root/world"):
get_node("/root/world").queue_free()
players.clear()
if get_tree().get_root().has_node("multiplayer_menu"):
get_tree().get_root().get_node("multiplayer_menu").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()
game_running = false
bots = false
game_name = ""
emit_signal("game_ended")
class PlayerSorter:
static func sort(a, b):
return a.position.x > b.position.x || a.position.x == b.position.x && a.position.y > b.position.y

152
scripts/game/gamestate.gd

@ -0,0 +1,152 @@
extends Node
const MAX_PEERS = 4
const LOBBY_READY_WAIT_TIME = 3
var Game = preload("res://scenes/game/Game.tscn")
var Player = preload("res://scenes/player/Player.tscn")
var HumanPlayer = preload("res://scenes/player/HumanPlayer.tscn")
var BotPlayer = preload("res://scenes/player/BotPlayer.tscn")
var game:Game
var players = {}
var game_name = ""
var bots:bool = false
var game_running:bool = false
signal players_changed(players)
signal game_ready(ready)
signal game_started()
signal game_ended()
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}
emit_signal("players_changed", players)
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, 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
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:
rpc("set_player",get_tree().get_network_unique_id(), new_name, new_color, new_ready)
remotesync func remove_player(id):
players.erase(id)
if game != null:
var game_players = game.get_node("players")
if game_players.has_node(str(id)):
game_players.remove_child(game_players.get_node(str(id)))
emit_signal("players_changed", players)
remotesync func game_ready(all_ready:bool):
if get_tree().is_network_server():
if all_ready:
game_running = true
else:
game_running = false
emit_signal("game_ready", all_ready)
remotesync func prepare_game():
get_tree().set_pause(true)
game = Game.instance()
get_tree().get_root().add_child(game)
get_tree().get_root().get_node("main_menu").hide()
for p_id in players:
var controls
var player = players[p_id]
var player_scene = Player.instance()
player_scene.set_network_master(p_id)
player_scene.set_name(str(p_id))
game.get_node("players").add_child(player_scene)
player_scene.set_player_name(player.name)
player_scene.set_player_color(player.color)
if p_id == get_tree().get_network_unique_id():
controls = HumanPlayer.instance()
controls.set_name("HumanControl_" + str(p_id))
game.add_child(controls)
controls.set_player(player_scene.get_path())
controls.set_network_master(p_id)
player_scene.set_start(player_scene.get_index())
if bots:
for index in range(MAX_PEERS-players.size()):
var bot_index = players.size() + index
var player_scene = Player.instance()
player_scene.set_name("bot_player" + str(bot_index))
game.get_node("players").add_child(player_scene)
player_scene.set_player_name("Bot " + str(bot_index))
player_scene.set_player_color(Color(randf(),randf(),randf()))
player_scene.add_to_group("bots")
if get_tree().is_network_server():
var bot = BotPlayer.instance()
bot.set_name("bot" + str(bot_index))
game.add_child(bot)
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())
if get_tree().is_network_server():
if players.has(get_tree().get_network_unique_id()):
player_prepared(get_tree().get_network_unique_id())
else:
rpc_id(1, "player_prepared", get_tree().get_network_unique_id())
remotesync func player_prepared(id):
if get_tree().is_network_server():
players[id].prepared = true
var all_prepared = true
for p_id in players:
all_prepared = all_prepared && players[p_id].prepared
if all_prepared:
rpc("post_start_game")
remotesync func post_start_game():
get_tree().set_pause(false)
emit_signal("game_started")
remotesync func set_bots(has_bots:bool):
bots = has_bots
func quit_game():
if game != null:
game.queue_free()
game = null
players.clear()
if get_tree().get_root().has_node("multiplayer_menu"):
get_tree().get_root().get_node("multiplayer_menu").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()
game_running = false
bots = false
game_name = ""
emit_signal("game_ended")

6
scripts/game/local_storage.gd

@ -10,10 +10,12 @@ func _ready():
func read_content(): func read_content():
var f = File.new() var f = File.new()
var err = f.open(FILE_PATH, File.READ) var err = f.open(FILE_PATH, File.READ)
var content = parse_json(f.get_as_text ())
var content = {}
if err == OK:
content = parse_json(f.get_as_text())
f.close()
if content == null: if content == null:
content = {} content = {}
f.close()
return content return content

8
scripts/game/route.gd

@ -17,10 +17,6 @@ func get_road(road_index):
return get_child(road_index) return get_child(road_index)
remotesync func set_network_master(id:int, recursive:bool = true):
.set_network_master(id)
remotesync func add_road(type, creator): remotesync func add_road(type, creator):
var transform = get_global_transform() var transform = get_global_transform()
var last_road = get_last_road() var last_road = get_last_road()
@ -37,12 +33,12 @@ remotesync func add_road(type, creator):
new_road.set_creator(creator) new_road.set_creator(creator)
if creator > 0: if creator > 0:
var player = get_parent().get_node("players/" + str(creator))
var player = gamestate.game.get_node(str(creator))
if player != null: if player != null:
new_road.set_color(player.get_player_color()) new_road.set_color(player.get_player_color())
add_child(new_road) add_child(new_road)
emit_signal("road_added", new_road) emit_signal("road_added", new_road)

59
scripts/game/world.gd

@ -1,59 +0,0 @@
extends Spatial
var players:Array
var route:Route
var first:Player
var last:Player
const REMOVE_LAST = 1
func _ready():
route = get_node("route")
if is_network_master():
route.rpc("add_road","Start", -1)
func _physics_process(delta):
if is_network_master():
set_player_order()
#destroy_after_last()
check_autotrack()
func set_player_order():
players = get_node("players").get_children()
players.sort_custom(PlayerSorter,"sort")
if players.size() > 0 && players[0] != first:
new_first(players[0])
if players.size() > 0 && players[players.size()-1] != last:
last = players[players.size()-1]
func new_first(player):
if first != null:
first.rpc("set_first",false)
first = player
first.rpc("set_first",true)
var p_id = first.get_network_master()
route.rpc("set_network_master",p_id)
func destroy_after_last():
if last != null:
if last.position.x != -1:
var max_index = last.position.x - REMOVE_LAST
if max_index > 0:
for i in range(max_index):
route.rpc("remove_road", i)
func check_autotrack():
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)
class PlayerSorter:
static func sort(a, b):
return a.position.x > b.position.x || a.position.x == b.position.x && a.position.y > b.position.y

4
scripts/menus/direct_host.gd

@ -12,7 +12,7 @@ func _draw():
func _on_host_pressed(): func _on_host_pressed():
var port = find_node("port").text
var port = find_node("port").get_value()
var bots = find_node("bots").is_pressed() var bots = find_node("bots").is_pressed()
var err = server.host_game(int(port), bots) var err = server.host_game(int(port), bots)
@ -20,7 +20,7 @@ func _on_host_pressed():
var lobby_menu = LobbyMenu.instance() var lobby_menu = LobbyMenu.instance()
get_tree().get_root().add_child(lobby_menu) get_tree().get_root().add_child(lobby_menu)
game.set_player(get_tree().get_network_unique_id())
gamestate.set_player(get_tree().get_network_unique_id())
queue_free() queue_free()
else: else:

17
scripts/menus/direct_join.gd

@ -6,22 +6,11 @@ func _draw():
func _on_join_pressed(): func _on_join_pressed():
var ip = find_node("ip").text
if not ip.is_valid_ip_address():
show_error_dialog(tr("INVALIP_IP4"))
return
var port = find_node("port").text
var ip = find_node("ip").text
var port = find_node("port").get_value()
client.join_game(ip, int(port)) client.join_game(ip, int(port))
queue_free() queue_free()
func _on_back_pressed(): func _on_back_pressed():
queue_free()
func show_error_dialog(text:String):
var dialog = get_node("error_dialog")
dialog.set_text(text)
dialog.popup_centered()
queue_free()

2
scripts/menus/ingame.gd

@ -22,4 +22,4 @@ func _on_settings_pressed():
func _on_end_pressed(): func _on_end_pressed():
game.quit_game()
gamestate.quit_game()

18
scripts/menus/lobby.gd

@ -13,9 +13,9 @@ func _ready():
get_node("menu/back").connect("pressed",self,"_on_back_pressed") 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")
gamestate.connect("players_changed", self, "_players_changed")
gamestate.connect("game_ready", self, "_game_ready")
gamestate.connect("game_started", self, "_game_started")
client.connect("server_disconnected", self, "_server_disconnected") client.connect("server_disconnected", self, "_server_disconnected")
player_settings.get_name_node().connect("text_changed",self,"_on_name_text_changed") player_settings.get_name_node().connect("text_changed",self,"_on_name_text_changed")
@ -24,9 +24,9 @@ func _ready():
countdown_timer.set_wait_time(server.LOBBY_READY_WAIT_TIME) countdown_timer.set_wait_time(server.LOBBY_READY_WAIT_TIME)
if game.game_name:
find_node("server_name").set_text(game.game_name)
find_node("server_name").set_tooltip(game.game_name)
if gamestate.game_name:
find_node("server_name").set_text(gamestate.game_name)
find_node("server_name").set_tooltip(gamestate.game_name)
func _draw(): func _draw():
@ -51,7 +51,7 @@ func _players_changed(players):
player_list.set_item_icon(player_list.get_item_count()-1, player_list.get_node("ready_icon").get_button_icon()) player_list.set_item_icon(player_list.get_item_count()-1, player_list.get_node("ready_icon").get_button_icon())
else: else:
player_list.set_item_icon(player_list.get_item_count()-1, player_list.get_node("not_ready_icon").get_button_icon()) player_list.set_item_icon(player_list.get_item_count()-1, player_list.get_node("not_ready_icon").get_button_icon())
find_node("server_bots").set_pressed(game.bots)
find_node("server_bots").set_pressed(gamestate.bots)
func _game_ready(all_ready): func _game_ready(all_ready):
@ -84,11 +84,11 @@ func _on_player_changed():
var name = player_settings.get_name_node().text var name = player_settings.get_name_node().text
var color = player_settings.get_color_node().color var color = player_settings.get_color_node().color
var ready = find_node("ready").pressed var ready = find_node("ready").pressed
game.update_player(name,color,ready)
gamestate.update_player(name,color,ready)
func _on_back_pressed(): func _on_back_pressed():
game.quit_game()
gamestate.quit_game()
if get_tree().get_root().has_node("multiplayer_menu"): if get_tree().get_root().has_node("multiplayer_menu"):
get_tree().get_root().get_node("multiplayer_menu").show() get_tree().get_root().get_node("multiplayer_menu").show()
get_tree().get_root().get_node("main_menu").hide() get_tree().get_root().get_node("main_menu").hide()

2
scripts/menus/main.gd

@ -6,7 +6,7 @@ var SettingsMenu = preload("res://scenes/menus/SettingsMenu.tscn")
func _ready(): func _ready():
game.connect("server_disconnected", self, "_server_disconnected")
gamestate.connect("server_disconnected", self, "_server_disconnected")
func _draw(): func _draw():
find_node("multiplayer").grab_focus() find_node("multiplayer").grab_focus()

2
scripts/menus/server.gd

@ -122,7 +122,7 @@ func _on_join_pressed():
func _connection_succeeded(): func _connection_succeeded():
var lobby_menu = LobbyMenu.instance() var lobby_menu = LobbyMenu.instance()
if selected_game && selected_game.has('name'): if selected_game && selected_game.has('name'):
game.game_name = selected_game.name
gamestate.game_name = selected_game.name
get_tree().get_root().add_child(lobby_menu) get_tree().get_root().add_child(lobby_menu)
get_node("refresh_timer").stop() get_node("refresh_timer").stop()
hide() hide()

2
scripts/menus/server_create.gd

@ -27,7 +27,7 @@ func _on_create_pressed():
func _on_game_created(result, response_code, headers, body): func _on_game_created(result, response_code, headers, body):
if result == OK && response_code == HTTPClient.RESPONSE_OK: if result == OK && response_code == HTTPClient.RESPONSE_OK:
var json = JSON.parse(body.get_string_from_utf8()) var json = JSON.parse(body.get_string_from_utf8())
game.game_name = json.result['name']
gamestate.game_name = json.result['name']
client.join_game(game_server.SERVER_ADDR, int(json.result['port'])) client.join_game(game_server.SERVER_ADDR, int(json.result['port']))
queue_free() queue_free()

8
scripts/networking/client.gd

@ -9,14 +9,14 @@ func join_game(ip, port:int):
get_tree().connect("connected_to_server", self, "_connected_ok") get_tree().connect("connected_to_server", self, "_connected_ok")
get_tree().connect("connection_failed", self, "_connected_fail") get_tree().connect("connection_failed", self, "_connected_fail")
get_tree().connect("server_disconnected", self, "_server_disconnected") get_tree().connect("server_disconnected", self, "_server_disconnected")
game.connect("game_ended",self,"_game_ended")
gamestate.connect("game_ended",self,"_game_ended")
var host = NetworkedMultiplayerENet.new() var host = NetworkedMultiplayerENet.new()
host.create_client(ip, port) host.create_client(ip, port)
get_tree().set_network_peer(host) get_tree().set_network_peer(host)
func _connected_ok(): func _connected_ok():
game.rpc("set_player", get_tree().get_network_unique_id())
gamestate.rpc("set_player", get_tree().get_network_unique_id())
emit_signal("connection_succeeded") emit_signal("connection_succeeded")
@ -29,7 +29,7 @@ func _connected_fail():
func _server_disconnected(): func _server_disconnected():
game.quit_game()
gamestate.quit_game()
emit_signal("server_disconnected") emit_signal("server_disconnected")
@ -38,7 +38,7 @@ func _game_ended():
get_tree().disconnect("connection_failed", self, "_connected_fail") get_tree().disconnect("connection_failed", self, "_connected_fail")
get_tree().disconnect("server_disconnected", self, "_server_disconnected") get_tree().disconnect("server_disconnected", self, "_server_disconnected")
game.disconnect("game_ended",self,"_game_ended")
gamestate.disconnect("game_ended",self,"_game_ended")
get_tree().set_refuse_new_network_connections(false) get_tree().set_refuse_new_network_connections(false)
get_tree().set_network_peer(null) get_tree().set_network_peer(null)

4
scripts/networking/game_server.gd

@ -2,8 +2,8 @@ extends Spatial
class_name GameServer class_name GameServer
const SERVER_ADDR = "127.0.0.1"
const API_ADDR = "http://" + SERVER_ADDR + ":5000/"
const SERVER_ADDR = "mur-server.lh8.de"
const API_ADDR = "https://" + SERVER_ADDR + "/"
const HEADERS = ["Content-Type: application/json"] const HEADERS = ["Content-Type: application/json"]
const SSL = false const SSL = false

49
scripts/networking/server.gd

@ -24,12 +24,12 @@ func _ready():
if argument.split("=")[0] == "--secret": if argument.split("=")[0] == "--secret":
server_secret=argument.split("=")[1] server_secret=argument.split("=")[1]
if argument.split("=")[0] == "--bots": if argument.split("=")[0] == "--bots":
game.set_bots(bool(int(argument.split("=")[1])))
gamestate.set_bots(bool(int(argument.split("=")[1])))
if dedicated_server: if dedicated_server:
var err = host_game(port) var err = host_game(port)
if err == OK: if err == OK:
print(server_id + "New game hosted: port=" + str(port) + " secret=" + str(server_secret) + " bots=" + str(game.bots))
print(server_id + "New game hosted: port=" + str(port) + " secret=" + str(server_secret) + " bots=" + str(gamestate.bots))
else: else:
print(server_id + "Could not create Server! (port=" + str(port) + " secret=" + str(server_secret) + ")") print(server_id + "Could not create Server! (port=" + str(port) + " secret=" + str(server_secret) + ")")
quit_server() quit_server()
@ -43,12 +43,12 @@ func host_game(port:int, set_bots:bool = false):
get_tree().connect("network_peer_connected", self, "_client_connected") get_tree().connect("network_peer_connected", self, "_client_connected")
get_tree().connect("network_peer_disconnected", self,"_client_disconnected") get_tree().connect("network_peer_disconnected", self,"_client_disconnected")
game.connect("players_changed",self,"_players_changed")
game.connect("game_ready",self,"_game_ready")
game.connect("game_ended",self,"_game_ended")
gamestate.connect("players_changed",self,"_players_changed")
gamestate.connect("game_ready",self,"_game_ready")
gamestate.connect("game_ended",self,"_game_ended")
if set_bots: if set_bots:
game.bots = true
gamestate.bots = true
if timer == null: if timer == null:
timer = Timer.new() timer = Timer.new()
@ -68,21 +68,25 @@ func local_game(name:String, color:Color, bots:bool):
var localhost = NetworkedMultiplayerENet.new() var localhost = NetworkedMultiplayerENet.new()
localhost.create_server(0, 0) localhost.create_server(0, 0)
get_tree().set_network_peer(localhost) get_tree().set_network_peer(localhost)
game.bots = bots
game.set_player(get_tree().get_network_unique_id(), name, color)
game.prepare_game()
game.post_start_game()
gamestate.bots = bots
gamestate.set_player(get_tree().get_network_unique_id(), name, color)
gamestate.prepare_game()
gamestate.post_start_game()
func update_server_data(): func update_server_data():
var req = game_server.http() var req = game_server.http()
req.put_request("game",to_json({'secret' : server_secret, 'player_count' : game.players.size(), 'running' : game.game_running}))
var player_count = 0
if gamestate.players != null:
player_count = gamestate.players.size()
req.put_request("game",to_json({'secret' : server_secret, 'player_count' : player_count, 'running' : gamestate.game_running}))
func _client_connected(id): func _client_connected(id):
if get_tree().is_network_server(): if get_tree().is_network_server():
if dedicated_server: if dedicated_server:
print(server_id + "peer connected: " + str(id)) print(server_id + "peer connected: " + str(id))
game.rpc_id(id, "set_bots" ,game.bots)
gamestate.rpc_id(id, "set_bots" ,gamestate.bots)
if not timer.is_stopped(): if not timer.is_stopped():
timer.disconnect("timeout",self,"quit_server") timer.disconnect("timeout",self,"quit_server")
timer.stop() timer.stop()
@ -92,11 +96,11 @@ func _client_disconnected(id):
if get_tree().is_network_server(): if get_tree().is_network_server():
if dedicated_server: if dedicated_server:
print(server_id + "peer disconnected: " + str(id)) print(server_id + "peer disconnected: " + str(id))
if game.game_running:
if gamestate.game_running:
emit_signal("server_error", "DISCONNECTED", [id]) emit_signal("server_error", "DISCONNECTED", [id])
game.rpc("remove_player" ,id)
gamestate.rpc("remove_player" ,id)
else: else:
game.rpc("remove_player" ,id)
gamestate.rpc("remove_player" ,id)
func _players_changed(players): func _players_changed(players):
@ -104,7 +108,7 @@ func _players_changed(players):
if dedicated_server: if dedicated_server:
update_server_data() update_server_data()
if players.empty(): if players.empty():
if game.game_running:
if gamestate.game_running:
print(server_id + "All players disconnected, close server.") print(server_id + "All players disconnected, close server.")
quit_server() quit_server()
else: else:
@ -124,13 +128,14 @@ func quit_server(triggered:bool = false):
func _on_delete_server(result, response_code, headers, body): func _on_delete_server(result, response_code, headers, body):
if result != OK || response_code != HTTPClient.RESPONSE_OK: if result != OK || response_code != HTTPClient.RESPONSE_OK:
print(server_id + "ERROR: _on_delete_server, server is in undefined state!")
print(server_id + "ERROR: _on_delete_server, server might be in undefined state!")
get_tree().quit()
func _start_game(): func _start_game():
if get_tree().is_network_server(): if get_tree().is_network_server():
get_tree().set_refuse_new_network_connections(true) get_tree().set_refuse_new_network_connections(true)
game.rpc("prepare_game")
gamestate.rpc("prepare_game")
func _game_ready(all_ready): func _game_ready(all_ready):
@ -148,9 +153,9 @@ func _game_ended():
get_tree().disconnect("network_peer_connected", self, "_client_connected") get_tree().disconnect("network_peer_connected", self, "_client_connected")
get_tree().disconnect("network_peer_disconnected", self,"_client_disconnected") get_tree().disconnect("network_peer_disconnected", self,"_client_disconnected")
game.disconnect("players_changed",self,"_players_changed")
game.disconnect("game_ready",self,"_game_ready")
game.disconnect("game_ended",self,"_game_ended")
gamestate.disconnect("players_changed",self,"_players_changed")
gamestate.disconnect("game_ready",self,"_game_ready")
gamestate.disconnect("game_ended",self,"_game_ended")
get_tree().set_refuse_new_network_connections(false) get_tree().set_refuse_new_network_connections(false)
get_tree().set_network_peer(null) get_tree().set_network_peer(null)

10
scripts/player/base_inventory.gd

@ -3,10 +3,10 @@ extends Spatial
class_name BaseInventory class_name BaseInventory
var road_straights = [ var road_straights = [
roads_factory.STRAIGHT,
roads_factory.STRAIGHT_SMALL,
roads_factory.BUMP, roads_factory.BUMP,
roads_factory.BUMP_SMALL, roads_factory.BUMP_SMALL,
roads_factory.STRAIGHT,
roads_factory.STRAIGHT_SMALL,
] ]
var roads_left = [ var roads_left = [
@ -49,11 +49,11 @@ var item:Road
var type:int = 0 var type:int = 0
var index:int = 0 var index:int = 0
signal item_changed(index)
signal item_changed(index, player)
func _ready(): func _ready():
route = get_node("/root/world/route")
route = gamestate.game.route
func set_player(new_player:Player): func set_player(new_player:Player):
@ -71,4 +71,4 @@ func set_item():
item.rotate_y(PI/2) item.rotate_y(PI/2)
emit_signal("item_changed", roads[type][index])
emit_signal("item_changed", roads[type][index], player)

46
scripts/player/base_player.gd

@ -1,46 +0,0 @@
extends Node
class_name BasePlayer
export var player_color:Color
var player_name:String
var is_out:bool = false
var position:Vector2
var road_index:int = -1
puppet var slave_position:Vector2
func get_race_car():
pass
func get_player_name():
return player_name
func set_player_name(new_name):
player_name = new_name
func get_player_color():
return player_color
func set_player_color(new_color):
player_color = new_color
var material = SpatialMaterial.new()
material.set_albedo(player_color)
get_race_car().get_node("body").set_surface_material(1,material)
func set_start(position:int):
pass
remotesync func set_first(is_first:bool):
if is_first:
add_to_group("first")
else:
remove_from_group("first")

46
scripts/player/bot_controls.gd

@ -2,8 +2,9 @@ extends Spatial
var player:Player var player:Player
var overspeed_rate:float = 0.8
var underspeed_rate:float = 0.3
const MAX_ROAD_INDEX = 1
var error_rate:float = 0.00
var underspeed_rate:float = 0.00
func _ready(): func _ready():
@ -19,26 +20,27 @@ func _physics_process(delta):
if player.get_road() != null: if player.get_road() != null:
var rate = randf() var rate = randf()
var road = player.get_road() var road = player.get_road()
var distance = player.follow.get_offset()
var road_index = 0
var speed_constrain = 0.0
while road != null && road_index < MAX_ROAD_INDEX:
for index in range(road.speed_constrains.size()):
var constrain = road.speed_constrains[index]
if constrain.z > 0:
speed_constrain = max(speed_constrain, constrain.z)
elif constrain.z < 0:
speed_constrain = min(speed_constrain, constrain.z)
road = player.route.get_road(road.get_index() + 1)
road_index += 1
var speed = player.current_speed var speed = player.current_speed
var has_constrain = false
for index in range(road.speed_constrains.size()):
var constrain = road.speed_constrains[index]
if constrain.x <= distance && constrain.y >= distance:
has_constrain = true
if constrain.z > 0 && speed < constrain.z && rate > underspeed_rate:
player.thrust = 1
elif rate > overspeed_rate:
player.thrust = -1
else:
player.thrust = 0
if not has_constrain:
if rate > underspeed_rate:
if speed_constrain < 0:
player.thrust = 1
elif speed_constrain > 0 && speed > speed_constrain:
player.thrust = -1
elif rate > underspeed_rate:
player.thrust = 1 player.thrust = 1
elif rate > overspeed_rate:
player.thrust = -1
else:
player.thrust = 0
else:
player.thrust = 0
func set_player(path:String): func set_player(path:String):
@ -46,8 +48,8 @@ func set_player(path:String):
get_node("inventory").set_player(player) get_node("inventory").set_player(player)
func set_overspeed_rate(new_overspeed_rate:float):
overspeed_rate = new_overspeed_rate
func set_error_rate(new_error_rate:float):
error_rate = new_error_rate
func set_underspeed_rate(new_underspeed_rate:float): func set_underspeed_rate(new_underspeed_rate:float):

2
scripts/player/bot_inventory.gd

@ -19,4 +19,4 @@ func _on_raceCar_road_entered(road):
func set_player(new_player:Player): func set_player(new_player:Player):
player = new_player player = new_player
player.get_race_car().connect("road_entered",self,"_on_raceCar_road_entered")
player.race_car.connect("road_entered",self,"_on_raceCar_road_entered")

4
scripts/player/human_controls.gd

@ -45,5 +45,5 @@ func set_player(path:String):
func set_debug_camera(idx): func set_debug_camera(idx):
if idx < player.get_parent().get_child_count():
camera.set_target_path(player.get_parent().get_child(idx).find_node("CameraTarget").get_path())
if idx < gamestate.game.players.get_child_count():
camera.set_target_path(gamestate.game.players.get_child(idx).find_node("CameraTarget").get_path())

3
scripts/player/human_inventory.gd

@ -10,6 +10,7 @@ func _ready():
var hud_track = get_node("../hud/inventory/track") var hud_track = get_node("../hud/inventory/track")
hud_track.get_texture().set_viewport_path_in_scene(str(get_path()) + "/viewport") hud_track.get_texture().set_viewport_path_in_scene(str(get_path()) + "/viewport")
connect("item_changed",self,"_on_item_changed") connect("item_changed",self,"_on_item_changed")
connect("item_changed",preview,"_on_inventory_item_changed")
func _physics_process(delta): func _physics_process(delta):
@ -51,7 +52,7 @@ func _physics_process(delta):
preview.item.hide() preview.item.hide()
func _on_item_changed(road_identifier):
func _on_item_changed(road_identifier, player):
if is_network_master(): if is_network_master():
if view.get_child_count() > 0: if view.get_child_count() > 0:
view.remove_child(view.get_child(0)) view.remove_child(view.get_child(0))

10
scripts/player/inventory_preview.gd

@ -3,14 +3,11 @@ extends Spatial
class_name Preview class_name Preview
var player:Player var player:Player
var route:Route
var item:Road var item:Road
func _ready(): func _ready():
route = get_node("/root/world/route")
route.connect("road_added",self,"_on_route_road_added")
get_parent().connect("item_changed",self,"_on_inventory_item_changed")
gamestate.game.route.connect("road_added",self,"_on_route_road_added")
func _on_route_road_added(road): func _on_route_road_added(road):
@ -23,14 +20,13 @@ func _on_route_road_added(road):
item.set_global_transform(transform) item.set_global_transform(transform)
func _on_inventory_item_changed(road_identifier):
func _on_inventory_item_changed(road_identifier, player):
if is_network_master(): if is_network_master():
if item: if item:
item.free() item.free()
item = roads_factory.get_road_instance(road_identifier) item = roads_factory.get_road_instance(road_identifier)
item.set_preview(true) item.set_preview(true)
var player = get_parent().player
if player != null: if player != null:
item.set_color(player.get_player_color()) item.set_color(player.get_player_color())
add_child(item) add_child(item)
_on_route_road_added(route.get_last_road())
_on_route_road_added(gamestate.game.route.get_last_road())

101
scripts/player/player.gd

@ -1,11 +1,15 @@
extends BasePlayer
extends Node
class_name Player class_name Player
const MAX_SPEED:float = 0.2 const MAX_SPEED:float = 0.2
const START_OFFSET = [1.70223, 1.20223, 0.702227, 0.202227 ]
const LANE_OFFSET = [-0.085, 0.085, -0.255, 0.255 ] const LANE_OFFSET = [-0.085, 0.085, -0.255, 0.255 ]
export var player_color:Color
var player_name:String
var thrust:int = 0 var thrust:int = 0
var current_speed:float = 0.0 var current_speed:float = 0.0
@ -13,12 +17,15 @@ export var speed_factor:float = 0.001
export var brake_factor:float = 2.0 export var brake_factor:float = 2.0
export var friction_brake_factor:float = 0.8 export var friction_brake_factor:float = 0.8
var timer:Timer
var path:Path
var follow:PathFollow
onready var race_car = get_node("Path/PathFollow/raceCar")
onready var timer:Timer = get_node("ResetTimer")
onready var path:Path = get_node("Path")
onready var follow:PathFollow = get_node("Path/PathFollow")
onready var route:Route
var lane:int var lane:int
var start_init:bool = true
var has_next:bool = false var has_next:bool = false
var is_resetable:bool = false var is_resetable:bool = false
var buffered_curve:Curve3D var buffered_curve:Curve3D
@ -27,15 +34,19 @@ var buffered_rotation:Vector3 = Vector3(0,0,0)
var last_rotation:Vector3 = Vector3(0,0,0) var last_rotation:Vector3 = Vector3(0,0,0)
var torque_penalty:Vector3 var torque_penalty:Vector3
var force_penalty:Vector3 var force_penalty:Vector3
var path_penalty:float
var is_out:bool = false
var position:Vector2
puppet var slave_position:Vector2
func _ready(): func _ready():
timer = get_node("ResetTimer")
path = get_node("Path")
route = gamestate.game.route
race_car.road_ray.set_collision_mask_bit(get_index(),1)
path.curve = path.curve.duplicate() path.curve = path.curve.duplicate()
path.curve.set_bake_interval(0.05) path.curve.set_bake_interval(0.05)
follow = get_node("Path/PathFollow")
func _physics_process(delta): func _physics_process(delta):
@ -86,9 +97,11 @@ func _physics_process(delta):
_out = _out.rotated(buffered_rotation.normalized(), buffered_rotation.length()) _out = _out.rotated(buffered_rotation.normalized(), buffered_rotation.length())
path.curve.add_point(buffered_translate + _pos, _in, _out) path.curve.add_point(buffered_translate + _pos, _in, _out)
path.curve.set_point_tilt(i, buffered_curve.get_point_tilt(i)) path.curve.set_point_tilt(i, buffered_curve.get_point_tilt(i))
follow.set_offset(0.001)
if get_road() != null:
road_index = get_road().get_index()
if not start_init:
follow.set_offset(0.001)
else:
follow.set_offset(START_OFFSET[lane])
start_init = false
if get_road() != null: if get_road() != null:
var road = get_road() var road = get_road()
var penalty_index = road.penalty_index(follow.get_offset(), current_speed) var penalty_index = road.penalty_index(follow.get_offset(), current_speed)
@ -96,34 +109,38 @@ func _physics_process(delta):
if penalty_index >= 0: if penalty_index >= 0:
torque_penalty = road.get_torque_penalty(penalty_index) torque_penalty = road.get_torque_penalty(penalty_index)
force_penalty = road.get_force_penalty(penalty_index) force_penalty = road.get_force_penalty(penalty_index)
path_penalty = road.get_path_penalty(penalty_index)
is_out = true is_out = true
is_resetable = false is_resetable = false
timer.start() timer.start()
check_position() check_position()
else: else:
var race_car = get_race_car()
race_car.get_node("ray").set_enabled(false) race_car.get_node("ray").set_enabled(false)
if force_penalty.length() != 0: if force_penalty.length() != 0:
race_car.apply_central_impulse(force_penalty * current_speed)
race_car.move_and_slide(force_penalty * current_speed + Vector3(0,-0.5,0))
if torque_penalty.length() != 0: if torque_penalty.length() != 0:
race_car.axis_lock_angular_x = false
race_car.axis_lock_angular_y = false
race_car.axis_lock_angular_z = false
race_car.apply_torque_impulse(torque_penalty * current_speed)
race_car.rotate_object_local(torque_penalty.normalized(), torque_penalty.length() * current_speed)
if path_penalty > 0 && follow.get_offset() > 0.0:
follow.set_offset(follow.get_offset() - 0.01)
path_penalty -= 0.01
current_speed -= 0.0002
if current_speed < 0:
current_speed = 0
else: else:
position = slave_position position = slave_position
func get_race_car():
return get_node("Path/PathFollow/raceCar")
func get_road(): func get_road():
return get_race_car().road
return race_car.road
func _on_raceCar_road_entered(road): func _on_raceCar_road_entered(road):
var prev_road = route.get_road(road.get_index()-1)
if prev_road != null:
prev_road.body.set_collision_layer_bit(get_index(),0)
buffered_curve = road.get_lane_curve(lane) buffered_curve = road.get_lane_curve(lane)
buffered_rotation = last_rotation buffered_rotation = last_rotation
@ -137,8 +154,34 @@ func _on_raceCar_road_entered(road):
has_next = true has_next = true
func get_player_name():
return player_name
func set_player_name(new_name):
player_name = new_name
func get_player_color():
return player_color
func set_player_color(new_color):
player_color = new_color
var material = SpatialMaterial.new()
material.set_albedo(player_color)
race_car.get_node("body").set_surface_material(1,material)
remotesync func set_first(is_first:bool):
if is_first:
add_to_group("first")
else:
remove_from_group("first")
master func check_position(): master func check_position():
position = Vector2(road_index, follow.get_offset())
position = Vector2(race_car.road_index, follow.get_offset())
rset("slave_position", position) rset("slave_position", position)
@ -146,15 +189,13 @@ master func reset():
if is_resetable: if is_resetable:
has_next = false has_next = false
current_speed = 0 current_speed = 0
var race_car = get_race_car()
# todo PATH
var route = get_node("/root/world/route")
var road = race_car.road var road = race_car.road
road.body.set_collision_layer_bit(get_index(),1)
while road.reset_index != 0: while road.reset_index != 0:
road = route.get_road(road.get_index() - road.reset_index) road = route.get_road(road.get_index() - road.reset_index)
road.body.set_collision_layer_bit(get_index(),1)
path.curve.clear_points() path.curve.clear_points()
@ -164,13 +205,9 @@ master func reset():
buffered_translate = road.get_translation() buffered_translate = road.get_translation()
last_rotation = road.get_rotation() last_rotation = road.get_rotation()
race_car.road_index = road.get_index()
race_car.road = null race_car.road = null
race_car.collider = null race_car.collider = null
race_car.linear_velocity = Vector3(0,0,0)
race_car.angular_velocity = Vector3(0,0,0)
race_car.axis_lock_angular_x = true
race_car.axis_lock_angular_y = true
race_car.axis_lock_angular_z = true
race_car.transform = Transform() race_car.transform = Transform()
race_car.get_node("ray").set_enabled(true) race_car.get_node("ray").set_enabled(true)

4
scripts/player/race_car.gd

@ -3,6 +3,7 @@ extends Spatial
var road_ray:RayCast var road_ray:RayCast
var collider var collider
var road:Road var road:Road
var road_index:int = 0
puppet var slave_transform:Transform puppet var slave_transform:Transform
@ -18,9 +19,10 @@ func _physics_process(delta):
if road_ray.is_colliding(): if road_ray.is_colliding():
if road_ray.get_collider() != collider: if road_ray.get_collider() != collider:
var parent = road_ray.get_collider().get_parent() var parent = road_ray.get_collider().get_parent()
if parent is Road && (road == null || road.get_index() < parent.get_index()) && !parent.is_preview():
if parent is Road && (road == null && road_index == parent.get_index() || road.get_index() == parent.get_index() - 1) && !parent.is_preview():
collider = road_ray.get_collider() collider = road_ray.get_collider()
road = parent road = parent
road_index = road.get_index()
emit_signal("road_entered",road) emit_signal("road_entered",road)
rset_unreliable("slave_transform", get_global_transform()) rset_unreliable("slave_transform", get_global_transform())
else: else:

27
scripts/road/road.gd

@ -4,8 +4,8 @@ class_name Road
export var end_rotation:Vector3 = Vector3(0,0,0) export var end_rotation:Vector3 = Vector3(0,0,0)
export var first_speed_factor:float = 0.8
export var creator_speed_factor:float = 0.8
export var first_speed_factor:float = 1.0
export var creator_speed_factor:float = 1.0
export var chasers_speed_factor:float = 1.0 export var chasers_speed_factor:float = 1.0
export var reset_index:int = 0 export var reset_index:int = 0
@ -13,20 +13,29 @@ export var reset_index:int = 0
export (PoolVector3Array) var speed_constrains = PoolVector3Array() export (PoolVector3Array) var speed_constrains = PoolVector3Array()
export (PoolVector3Array) var force_penalties = PoolVector3Array() export (PoolVector3Array) var force_penalties = PoolVector3Array()
export (PoolVector3Array) var torque_penalties = PoolVector3Array() export (PoolVector3Array) var torque_penalties = PoolVector3Array()
export (Array,float) var path_penalties = []
var body:StaticBody
var creator:int = -1 var creator:int = -1
var preview:bool = false var preview:bool = false
func _ready():
func _init():
if not has_node("StaticBody"): if not has_node("StaticBody"):
var body = StaticBody.new()
body = StaticBody.new()
body.set_name("StaticBody") body.set_name("StaticBody")
var shape = CollisionShape.new() var shape = CollisionShape.new()
shape.set_name("CollisionShape") shape.set_name("CollisionShape")
shape.shape = mesh.create_trimesh_shape() shape.shape = mesh.create_trimesh_shape()
body.add_child(shape) body.add_child(shape)
body.set_collision_layer_bit(0,1)
body.set_collision_layer_bit(1,1)
body.set_collision_layer_bit(2,1)
body.set_collision_layer_bit(3,1)
add_child(body) add_child(body)
else:
body = get_node("StaticBody")
func get_creator(): func get_creator():
@ -108,6 +117,16 @@ func get_force_penalty(index:int):
return Vector3(0,0,0) return Vector3(0,0,0)
func get_path_penalty(index:int):
if index >= 0:
if path_penalties.size() < (index + 1):
return get_path_penalty(index - 1)
return path_penalties[index]
return 0.0
func get_first_speed_factor(): func get_first_speed_factor():
return first_speed_factor return first_speed_factor

1
scripts/road/roads_factory.gd

@ -2,6 +2,7 @@ extends Node
class_name TracksFactory class_name TracksFactory
const START = "Start"
const STRAIGHT = "StraightLong" const STRAIGHT = "StraightLong"
const STRAIGHT_SMALL = "Straight" const STRAIGHT_SMALL = "Straight"
const CURVE_RIGHT = "CornerLarge" const CURVE_RIGHT = "CornerLarge"

Loading…
Cancel
Save