Browse Source

added basic bots, code clean up, fixed reset path, added patreon link

Lurkars 6 years ago
parent
commit
316521f7a3
  1. 2
      README.md
  2. 18
      project.godot
  3. 14
      scenes/debug/PathFollow.tscn
  4. 13
      scenes/game/world.tscn
  5. 8
      scenes/lobby/lobby.tscn
  6. 10
      scenes/player/BotPlayer.tscn
  7. 100
      scenes/player/FullPlayer.tscn
  8. 97
      scenes/player/HumanPlayer.tscn
  9. 6
      scenes/player/PathPlayerBot.tscn
  10. 34
      scenes/player/PathPlayerControls.tscn
  11. 16
      scenes/player/Player.tscn
  12. 56
      scenes/player/inventory.tscn
  13. 31
      scripts/game/game_state.gd
  14. 13
      scripts/game/world.gd
  15. 6
      scripts/lobby/lobby.gd
  16. 71
      scripts/player/BaseInventory.gd
  17. 42
      scripts/player/BasePlayer.gd
  18. 3
      scripts/player/BotControls.gd
  19. 19
      scripts/player/BotInventory.gd
  20. 105
      scripts/player/FullPlayer.gd
  21. 7
      scripts/player/HumanControls.gd
  22. 58
      scripts/player/HumanInventory.gd
  23. 18
      scripts/player/InventoryPreview.gd
  24. 161
      scripts/player/PathPlayerBase.gd
  25. 173
      scripts/player/Player.gd
  26. 114
      scripts/player/inventory.gd
  27. 94
      scripts/player/player_controls.gd

2
README.md

@ -10,4 +10,4 @@ Feel free to donate [Kenney · Racing Kit](https://kenney.nl/assets/racing-kit).
## contribution ## contribution
Feel free to contribute enhancements via pull request or ideas via issues Feel free to contribute enhancements via pull request or ideas via issues
## donations ## donations
If you want to donate my work, feel free to do via [PayPal](https://www.paypal.me/Lurkars)
If you want to donate my work, feel free to do via [PayPal](https://www.paypal.me/Lurkars) or become a [Patreon](https://www.patreon.com/champonthis)

18
project.godot

@ -10,16 +10,16 @@ config_version=4
_global_script_classes=[ { _global_script_classes=[ {
"base": "Spatial", "base": "Spatial",
"class": "Inventory",
"class": "BaseInventory",
"language": "GDScript", "language": "GDScript",
"path": "res://scripts/player/inventory.gd"
"path": "res://scripts/player/BaseInventory.gd"
}, { }, {
"base": "Player",
"class": "PathPlayerBase",
"base": "Node",
"class": "BasePlayer",
"language": "GDScript", "language": "GDScript",
"path": "res://scripts/player/PathPlayerBase.gd"
"path": "res://scripts/player/BasePlayer.gd"
}, { }, {
"base": "Node",
"base": "BasePlayer",
"class": "Player", "class": "Player",
"language": "GDScript", "language": "GDScript",
"path": "res://scripts/player/Player.gd" "path": "res://scripts/player/Player.gd"
@ -27,7 +27,7 @@ _global_script_classes=[ {
"base": "Spatial", "base": "Spatial",
"class": "Preview", "class": "Preview",
"language": "GDScript", "language": "GDScript",
"path": "res://scripts/game/preview.gd"
"path": "res://scripts/player/InventoryPreview.gd"
}, { }, {
"base": "MeshInstance", "base": "MeshInstance",
"class": "Road", "class": "Road",
@ -50,8 +50,8 @@ _global_script_classes=[ {
"path": "res://scripts/Util.gd" "path": "res://scripts/Util.gd"
} ] } ]
_global_script_class_icons={ _global_script_class_icons={
"Inventory": "",
"PathPlayerBase": "",
"BaseInventory": "",
"BasePlayer": "",
"Player": "", "Player": "",
"Preview": "", "Preview": "",
"Road": "", "Road": "",

14
scenes/debug/PathFollow.tscn

@ -1,14 +0,0 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://assets/raceCar/body.obj" type="ArrayMesh" id=1]
[node name="PathFollow" type="PathFollow"]
rotation_mode = 4
loop = false
[node name="body" type="MeshInstance" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 0.999999, 0, 0, -0.125 )
mesh = ExtResource( 1 )
material/0 = null
material/1 = null
material/2 = null

13
scenes/game/world.tscn

@ -1,10 +1,7 @@
[gd_scene load_steps=6 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/world.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]
[ext_resource path="res://scripts/game/preview.gd" type="Script" id=3]
[ext_resource path="res://scenes/player/inventory.tscn" type="PackedScene" id=4]
[ext_resource path="res://scripts/player/inventory.gd" type="Script" id=5]
[node name="world" type="Spatial"] [node name="world" type="Spatial"]
script = ExtResource( 1 ) script = ExtResource( 1 )
@ -12,12 +9,6 @@ script = ExtResource( 1 )
[node name="route" type="Spatial" parent="."] [node name="route" type="Spatial" parent="."]
script = ExtResource( 2 ) script = ExtResource( 2 )
[node name="preview" type="Spatial" parent="."]
script = ExtResource( 3 )
[node name="inventory" parent="." instance=ExtResource( 4 )]
script = ExtResource( 5 )
[node name="players" type="Spatial" parent="."] [node name="players" type="Spatial" parent="."]
[node name="sun" type="DirectionalLight" parent="."] [node name="sun" type="DirectionalLight" parent="."]
@ -26,5 +17,3 @@ visible = false
light_energy = 5.0 light_energy = 5.0
directional_shadow_mode = 1 directional_shadow_mode = 1
directional_shadow_max_distance = 25.0 directional_shadow_max_distance = 25.0
[connection signal="road_added" from="route" to="preview" method="_on_route_road_added"]
[connection signal="item_changed" from="inventory" to="preview" method="_on_inventory_item_changed"]

8
scenes/lobby/lobby.tscn

@ -128,14 +128,6 @@ size_flags_horizontal = 2
size_flags_vertical = 2 size_flags_vertical = 2
text = "Join" text = "Join"
[node name="full" type="CheckBox" parent="connect"]
visible = false
margin_left = 18.0
margin_top = 182.0
margin_right = 69.0
margin_bottom = 206.0
text = "Full"
[node name="quick" type="Button" parent="connect"] [node name="quick" type="Button" parent="connect"]
margin_left = 103.0 margin_left = 103.0
margin_top = 214.0 margin_top = 214.0

10
scenes/player/BotPlayer.tscn

@ -0,0 +1,10 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://scripts/player/BotControls.gd" type="Script" id=1]
[ext_resource path="res://scripts/player/BotInventory.gd" type="Script" id=2]
[node name="BotPlayer" type="Spatial"]
script = ExtResource( 1 )
[node name="inventory" type="Spatial" parent="."]
script = ExtResource( 2 )

100
scenes/player/FullPlayer.tscn

@ -1,100 +0,0 @@
[gd_scene load_steps=7 format=2]
[ext_resource path="res://scripts/player/FullPlayer.gd" type="Script" id=1]
[ext_resource path="res://scripts/player/raceCar.gd" type="Script" id=2]
[ext_resource path="res://assets/raceCar/body.obj" type="ArrayMesh" id=3]
[ext_resource path="res://assets/raceCar/wheel.obj" type="ArrayMesh" id=4]
[sub_resource type="SpatialMaterial" id=1]
albedo_color = Color( 0.14902, 0.14902, 0.14902, 1 )
[sub_resource type="BoxShape" id=2]
extents = Vector3( 0.05, 0.03, 0.13 )
[node name="FullPlayer" type="Spatial"]
script = ExtResource( 1 )
[node name="raceCar" type="VehicleBody" parent="."]
script = ExtResource( 2 )
[node name="body" type="MeshInstance" parent="raceCar"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.125 )
mesh = ExtResource( 3 )
material/0 = null
material/1 = null
material/2 = null
[node name="wheelBackLeft" type="VehicleWheel" parent="raceCar"]
editor/display_folded = true
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.061, 0.024, -0.082 )
use_as_traction = true
wheel_radius = 0.028
wheel_rest_length = 0.04
wheel_friction_slip = 1000.0
suspension_travel = 0.04
suspension_stiffness = 100.0
[node name="MeshInstance" type="MeshInstance" parent="raceCar/wheelBackLeft"]
mesh = ExtResource( 4 )
material/0 = SubResource( 1 )
material/1 = null
[node name="wheelBackRight" type="VehicleWheel" parent="raceCar"]
editor/display_folded = true
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.061, 0.024, -0.082 )
use_as_traction = true
wheel_radius = 0.028
wheel_rest_length = 0.04
wheel_friction_slip = 1000.0
suspension_travel = 0.04
suspension_stiffness = 100.0
[node name="MeshInstance" type="MeshInstance" parent="raceCar/wheelBackRight"]
transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0 )
mesh = ExtResource( 4 )
material/0 = SubResource( 1 )
material/1 = null
[node name="wheelFrontLeft" type="VehicleWheel" parent="raceCar"]
editor/display_folded = true
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.061, 0.024, 0.078 )
use_as_steering = true
wheel_radius = 0.028
wheel_rest_length = 0.04
wheel_friction_slip = 1000.0
suspension_travel = 0.04
suspension_stiffness = 100.0
[node name="MeshInstance" type="MeshInstance" parent="raceCar/wheelFrontLeft"]
mesh = ExtResource( 4 )
material/0 = SubResource( 1 )
material/1 = null
[node name="wheelFrontRight" type="VehicleWheel" parent="raceCar"]
editor/display_folded = true
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.061, 0.024, 0.078 )
use_as_steering = true
wheel_radius = 0.028
wheel_rest_length = 0.04
wheel_friction_slip = 1000.0
suspension_travel = 0.04
suspension_stiffness = 100.0
[node name="MeshInstance" type="MeshInstance" parent="raceCar/wheelFrontRight"]
transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0 )
mesh = ExtResource( 4 )
material/0 = SubResource( 1 )
material/1 = null
[node name="collision" type="CollisionShape" parent="raceCar"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.04, 0.01 )
shape = SubResource( 2 )
[node name="CameraTarget" type="Spatial" parent="raceCar"]
transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0.3, -0.6 )
[node name="ray" type="RayCast" parent="raceCar"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0 )
enabled = true
cast_to = Vector3( 0, -0.2, 0 )
[connection signal="road_entered" from="raceCar" to="." method="_on_raceCar_road_entered"]

97
scenes/player/HumanPlayer.tscn

@ -0,0 +1,97 @@
[gd_scene load_steps=6 format=2]
[ext_resource path="res://scripts/player/HumanControls.gd" type="Script" id=1]
[ext_resource path="res://scripts/player/HumanInventory.gd" type="Script" id=2]
[ext_resource path="res://scenes/road/roadStraightLong.tscn" type="PackedScene" id=3]
[ext_resource path="res://scripts/player/InventoryPreview.gd" type="Script" id=4]
[sub_resource type="ViewportTexture" id=1]
viewport_path = NodePath("inventory/viewport")
[node name="HumanPlayer" type="Spatial"]
script = ExtResource( 1 )
[node name="hud" type="CanvasLayer" parent="."]
[node name="speed" type="Label" parent="hud"]
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
margin_left = -77.0
margin_top = -39.0
margin_right = 77.0
grow_horizontal = 2
grow_vertical = 2
align = 1
valign = 1
[node name="reset" type="Label" parent="hud"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -20.0
margin_top = -7.0
margin_right = 20.0
margin_bottom = 7.0
align = 1
valign = 1
uppercase = true
[node name="inventory" type="Control" parent="hud"]
visible = false
anchor_right = 1.0
anchor_bottom = 1.0
[node name="background" type="ColorRect" parent="hud/inventory"]
anchor_left = 0.5
anchor_right = 0.5
margin_left = -75.0
margin_right = 75.0
margin_bottom = 150.0
[node name="track" type="TextureRect" parent="hud/inventory"]
anchor_left = 0.5
anchor_right = 0.5
margin_left = -75.0
margin_right = 75.0
margin_bottom = 150.0
texture = SubResource( 1 )
[node name="type" type="Label" parent="hud/inventory"]
anchor_left = 0.5
anchor_right = 0.5
margin_left = -74.0
margin_right = 75.0
margin_bottom = 58.0
grow_horizontal = 2
grow_vertical = 2
custom_colors/font_color = Color( 0, 0, 0, 1 )
align = 1
valign = 1
[node name="inventory" type="Spatial" parent="."]
script = ExtResource( 2 )
[node name="viewport" type="Viewport" parent="inventory"]
size = Vector2( 150, 150 )
transparent_bg = true
hdr = false
render_target_v_flip = true
[node name="camera" type="Camera" parent="inventory/viewport"]
transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -50.616, -999.296, 0 )
current = true
fov = 100.0
near = 0.5
far = 20.0
[node name="view" type="Spatial" parent="inventory"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -50, -1000, 0 )
[node name="roadStraightLong" parent="inventory/view" instance=ExtResource( 3 )]
transform = Transform( -4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0 )
[node name="preview" type="Spatial" parent="inventory"]
script = ExtResource( 4 )

6
scenes/player/PathPlayerBot.tscn

@ -1,6 +0,0 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://scripts/player/PathPlayerBot.gd" type="Script" id=1]
[node name="PlayerControls" type="Spatial"]
script = ExtResource( 1 )

34
scenes/player/PathPlayerControls.tscn

@ -1,34 +0,0 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://scripts/player/PathPlayerControls.gd" type="Script" id=1]
[node name="PlayerControls" type="Spatial"]
script = ExtResource( 1 )
[node name="hud" type="CanvasLayer" parent="."]
[node name="speed" type="Label" parent="hud"]
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
margin_left = -77.0
margin_top = -39.0
margin_right = 77.0
grow_horizontal = 2
grow_vertical = 2
align = 1
valign = 1
[node name="reset" type="Label" parent="hud"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -20.0
margin_top = -7.0
margin_right = 20.0
margin_bottom = 7.0
align = 1
valign = 1
uppercase = true

16
scenes/player/PathPlayerBase.tscn → scenes/player/Player.tscn

@ -1,6 +1,6 @@
[gd_scene load_steps=8 format=2] [gd_scene load_steps=8 format=2]
[ext_resource path="res://scripts/player/PathPlayerBase.gd" type="Script" id=1]
[ext_resource path="res://scripts/player/Player.gd" type="Script" id=1]
[ext_resource path="res://scripts/player/raceCar.gd" type="Script" id=2] [ext_resource path="res://scripts/player/raceCar.gd" type="Script" id=2]
[ext_resource path="res://assets/raceCar/body.obj" type="ArrayMesh" id=3] [ext_resource path="res://assets/raceCar/body.obj" type="ArrayMesh" id=3]
[ext_resource path="res://assets/raceCar/wheel.obj" type="ArrayMesh" id=4] [ext_resource path="res://assets/raceCar/wheel.obj" type="ArrayMesh" id=4]
@ -18,7 +18,7 @@ albedo_color = Color( 0.14902, 0.14902, 0.14902, 1 )
[sub_resource type="BoxShape" id=3] [sub_resource type="BoxShape" id=3]
extents = Vector3( 0.075079, 0.03, 0.13 ) extents = Vector3( 0.075079, 0.03, 0.13 )
[node name="BasePathPlayer" type="Spatial"]
[node name="Player" type="Spatial"]
script = ExtResource( 1 ) script = ExtResource( 1 )
[node name="Path" type="Path" parent="."] [node name="Path" type="Path" parent="."]
@ -83,17 +83,5 @@ cast_to = Vector3( 0, -0.2, 0 )
[node name="ResetTimer" type="Timer" parent="."] [node name="ResetTimer" type="Timer" parent="."]
wait_time = 3.0 wait_time = 3.0
one_shot = true one_shot = true
[node name="debug_path" type="CSGPolygon" parent="."]
visible = false
invert_faces = true
polygon = PoolVector2Array( -0.05, 0.05, -0.05, 0.1, 0.05, 0.1, 0.05, 0.05 )
mode = 2
path_node = NodePath("../Path")
path_interval = 0.1
path_rotation = 2
path_local = false
path_continuous_u = false
path_joined = false
[connection signal="road_entered" from="Path/PathFollow/raceCar" to="." method="_on_raceCar_road_entered"] [connection signal="road_entered" from="Path/PathFollow/raceCar" to="." method="_on_raceCar_road_entered"]
[connection signal="timeout" from="ResetTimer" to="." method="_on_ResetTimer_timeout"] [connection signal="timeout" from="ResetTimer" to="." method="_on_ResetTimer_timeout"]

56
scenes/player/inventory.tscn

@ -1,56 +0,0 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://scenes/road/roadStraightLong.tscn" type="PackedScene" id=1]
[sub_resource type="ViewportTexture" id=1]
viewport_path = NodePath("viewport")
[node name="inventory" type="Spatial"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -50, 0, 0 )
[node name="viewport" type="Viewport" parent="."]
size = Vector2( 150, 150 )
transparent_bg = true
hdr = false
render_target_v_flip = true
[node name="camera" type="Camera" parent="viewport"]
transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -50.6157, 0.703695, 0 )
current = true
fov = 100.0
near = 0.5
far = 20.0
[node name="HUD" type="CanvasLayer" parent="."]
[node name="background" type="ColorRect" parent="HUD"]
anchor_left = 0.5
anchor_right = 0.5
margin_left = -75.0
margin_right = 75.0
margin_bottom = 150.0
[node name="track" type="TextureRect" parent="HUD"]
anchor_left = 0.5
anchor_right = 0.5
margin_left = -75.0
margin_right = 75.0
margin_bottom = 150.0
texture = SubResource( 1 )
[node name="type" type="Label" parent="HUD"]
anchor_left = 0.5
anchor_right = 0.5
margin_left = -74.0
margin_right = 75.0
margin_bottom = 58.0
grow_horizontal = 2
grow_vertical = 2
custom_colors/font_color = Color( 0, 0, 0, 1 )
align = 1
valign = 1
[node name="view" type="Spatial" parent="."]
[node name="roadStraightLong" parent="view" instance=ExtResource( 1 )]
transform = Transform( -4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0 )

31
scripts/game/game_state.gd

@ -9,17 +9,13 @@ const MAX_PEERS = MAX_PLAYERS - 1
var world_scene = preload("res://scenes/game/world.tscn") var world_scene = preload("res://scenes/game/world.tscn")
var path_player_scene = preload("res://scenes/player/PathPlayerBase.tscn")
var path_player_controls_scene = preload("res://scenes/player/PathPlayerControls.tscn")
var path_player_bot_scene = preload("res://scenes/player/PathPlayerBot.tscn")
var full_player_scene = preload("res://scenes/player/FullPlayer.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 # Name for my player
var player_name = "Undefined" var player_name = "Undefined"
var player_color = Color("#000000") var player_color = Color("#000000")
var full = false
puppet var slave_full = false
# Names for remote players in id:name format # Names for remote players in id:name format
var players = {} var players = {}
@ -69,7 +65,6 @@ remote func register_player(id, new_player_name, new_player_color):
if (get_tree().is_network_server()): if (get_tree().is_network_server()):
# If we are the server, let everyone know about the new player # 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 rpc_id(id, "register_player", 1, player_name, player_color) # Send myself to new dude
rset_id(id, "slave_full", full)
for p_id in players: # Then, for each remote player 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(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 rpc_id(p_id, "register_player", id, new_player_name, new_player_color) # Send new dude to player
@ -88,15 +83,9 @@ remote func pre_start_game(spawn_points):
get_tree().get_root().get_node("lobby").hide() get_tree().get_root().get_node("lobby").hide()
full = slave_full
for p_id in spawn_points: for p_id in spawn_points:
var player
var controls var controls
if full:
player = full_player_scene.instance()
else:
player = path_player_scene.instance()
var player = player_scene.instance()
player.set_network_master(p_id) player.set_network_master(p_id)
player.set_name(str(p_id)) player.set_name(str(p_id))
@ -107,7 +96,8 @@ remote func pre_start_game(spawn_points):
# If node for this peer id, set name # If node for this peer id, set name
player.set_player_name(player_name) player.set_player_name(player_name)
player.set_player_color(player_color) player.set_player_color(player_color)
controls = path_player_controls_scene.instance()
controls = human_player_scene.instance()
controls.set_name("HumanControl_" + str(p_id))
world.add_child(controls) world.add_child(controls)
controls.set_player(player.get_path()) controls.set_player(player.get_path())
controls.set_network_master(p_id) controls.set_network_master(p_id)
@ -122,11 +112,12 @@ remote func pre_start_game(spawn_points):
if bots: if bots:
for index in range(4-spawn_points.size()): for index in range(4-spawn_points.size()):
var bot_index = spawn_points.size() + index var bot_index = spawn_points.size() + index
var player = path_player_scene.instance()
var player = player_scene.instance()
player.set_name("bot_player" + str(bot_index)) player.set_name("bot_player" + str(bot_index))
world.get_node("players").add_child(player) world.get_node("players").add_child(player)
player.add_to_group("bots")
if get_tree().is_network_server(): if get_tree().is_network_server():
var bot = path_player_bot_scene.instance()
var bot = bot_player_scene.instance()
bot.set_name("bot" + str(bot_index)) bot.set_name("bot" + str(bot_index))
world.add_child(bot) world.add_child(bot)
bot.set_player(player.get_path()) bot.set_player(player.get_path())
@ -156,11 +147,9 @@ remote func ready_to_start(id):
rpc_id(p, "post_start_game") rpc_id(p, "post_start_game")
post_start_game() post_start_game()
func host_game(new_player_name, new_player_color, new_full):
func host_game(new_player_name, new_player_color):
player_name = new_player_name player_name = new_player_name
player_color = new_player_color player_color = new_player_color
full = new_full
slave_full = full
var host = NetworkedMultiplayerENet.new() var host = NetworkedMultiplayerENet.new()
host.create_server(DEFAULT_PORT, MAX_PEERS) host.create_server(DEFAULT_PORT, MAX_PEERS)
get_tree().set_network_peer(host) get_tree().set_network_peer(host)

13
scripts/game/world.gd

@ -2,8 +2,6 @@ extends Spatial
var players:Array var players:Array
var route:Route var route:Route
var inventory
var preview:Preview
var first:Player var first:Player
var last:Player var last:Player
@ -11,8 +9,6 @@ const remove_last = 1
func _ready(): func _ready():
route = get_node("route") route = get_node("route")
inventory = get_node("inventory")
preview = get_node("preview")
if is_network_master(): if is_network_master():
route.rpc("add_road","Start", -1) route.rpc("add_road","Start", -1)
@ -31,11 +27,12 @@ func set_player_order():
last = players[players.size()-1] last = players[players.size()-1]
func new_first(player): func new_first(player):
if first != null:
first.rpc("set_first",false)
first = player first = player
first.rpc("set_first",true)
var p_id = first.get_network_master() var p_id = first.get_network_master()
route.rpc("set_network_master",p_id) route.rpc("set_network_master",p_id)
preview.rpc("set_network_master",p_id)
inventory.rpc("set_network_master",p_id)
func destroy_after_last(): func destroy_after_last():
if (last != null): if (last != null):
@ -47,10 +44,6 @@ func destroy_after_last():
func check_autotrack(): func check_autotrack():
if (first != null): if (first != null):
if first.is_out:
inventory.rpc("set_network_master",-1)
else:
inventory.rpc("set_network_master",first.get_network_master())
if first.position.x != -1 && route.get_last_road() != null: if first.position.x != -1 && route.get_last_road() != null:
if first.position.x == route.get_last_road().get_index(): if first.position.x == route.get_last_road().get_index():
route.rpc("add_road", roads_factory.STRAIGHT, -1) route.rpc("add_road", roads_factory.STRAIGHT, -1)

6
scripts/lobby/lobby.gd

@ -19,8 +19,7 @@ func _on_host_pressed():
var player_name = get_node("connect/name").text var player_name = get_node("connect/name").text
var player_color = get_node("connect/color").color var player_color = get_node("connect/color").color
var full = get_node("connect/full").is_pressed()
game_state.host_game(player_name, player_color, full)
game_state.host_game(player_name, player_color)
refresh_lobby() refresh_lobby()
func _on_join_pressed(): func _on_join_pressed():
@ -80,6 +79,5 @@ func _on_start_pressed():
func _on_quick_pressed(): func _on_quick_pressed():
var player_name = get_node("connect/name").text var player_name = get_node("connect/name").text
var player_color = get_node("connect/color").color var player_color = get_node("connect/color").color
var full = get_node("connect/full").is_pressed()
game_state.host_game(player_name, player_color, full)
game_state.host_game(player_name, player_color)
game_state.begin_game() game_state.begin_game()

71
scripts/player/BaseInventory.gd

@ -0,0 +1,71 @@
extends Spatial
class_name BaseInventory
var road_straights = [
roads_factory.STRAIGHT,
roads_factory.STRAIGHT_SMALL,
roads_factory.BUMP,
roads_factory.BUMP_SMALL,
]
var roads_left = [
roads_factory.CURVE_LEFT,
roads_factory.CURVE_LARGE_LEFT,
roads_factory.CURVE_SMALL_LEFT,
roads_factory.SKEW_LEFT,
roads_factory.CURVED_LEFT,
]
var roads_right = [
roads_factory.CURVE_RIGHT,
roads_factory.CURVE_LARGE_RIGHT,
roads_factory.CURVE_SMALL_RIGHT,
roads_factory.SKEW_RIGHT,
roads_factory.CURVED_RIGHT,
]
var roads_up = [
roads_factory.RAMP_UP,
roads_factory.RAMP_CURVED_UP,
roads_factory.RAMP_SMALL_UP,
]
var roads_down = [
roads_factory.RAMP_DOWN,
roads_factory.RAMP_CURVED_DOWN,
roads_factory.RAMP_SMALL_DOWN,
]
var roads_special = [
roads_factory.LOOP,
]
var roads = [ road_straights, roads_left, roads_right, roads_up, roads_down, roads_special ]
var player:Player
var route:Route
var item:Road
var type:int = 0
var index:int = 0
signal item_changed(index)
func _ready():
route = get_node("/root/world/route")
func set_player(new_player:Player):
player = new_player
func set_item():
if is_network_master():
if item:
item.free()
item = roads_factory.get_road_instance(roads[type][index])
if player != null:
item.set_color(player.get_player_color())
item.rotate_y(PI/2)
emit_signal("item_changed", roads[type][index])

42
scripts/player/BasePlayer.gd

@ -0,0 +1,42 @@
extends Node
class_name BasePlayer
# player vars
export var player_color:Color
var player_name:String
# positions
var is_out:bool = false
var position:Vector2
var road_index:int = -1
# puppets
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")

3
scripts/player/PathPlayerBot.gd → scripts/player/BotControls.gd

@ -1,6 +1,6 @@
extends Spatial extends Spatial
var player:PathPlayerBase
var player:Player
var overspeed_rate:float = 0.8 var overspeed_rate:float = 0.8
var underspeed_rate:float = 0.8 var underspeed_rate:float = 0.8
@ -38,6 +38,7 @@ func _physics_process(delta):
func set_player(path:String): func set_player(path:String):
player = get_node(path) player = get_node(path)
get_node("inventory").set_player(player)
func set_overspeed_rate(new_overspeed_rate:float): func set_overspeed_rate(new_overspeed_rate:float):
overspeed_rate = new_overspeed_rate overspeed_rate = new_overspeed_rate

19
scripts/player/BotInventory.gd

@ -0,0 +1,19 @@
extends BaseInventory
var rand:RandomNumberGenerator = RandomNumberGenerator.new()
func _ready():
rand.randomize()
func _on_raceCar_road_entered(road):
if is_network_master():
if player != null:
if player.is_in_group("first"):
if route.get_last_road().get_index() <= (road.get_index() +2):
type = rand.randi_range(0,roads.size() -1)
index = rand.randi_range(0, roads[type].size() -1)
route.rpc("add_road", roads[type][index], -1)
func set_player(new_player:Player):
player = new_player
player.get_race_car().connect("road_entered",self,"_on_raceCar_road_entered")

105
scripts/player/FullPlayer.gd

@ -1,105 +0,0 @@
extends Player
export var MAX_SPEED = 40.0
export var MAX_ENGINE_FORCE = 40.0
export var MAX_BRAKE_FORCE = 7.0
export var MAX_STEER_ANGLE = 0.7
export var steer_speed = 1.0
export var brake_factor = 0.1
puppet var slave_steering = 0.0
var steer_target = 0.0
var steer_angle = 0.0
var had_throttle_or_brake_input = false
var is_reverse = false
var race_car
const start_offset_x = [-0.17257, 0.17257, -0.17257, 0.17257 ]
const start_offset_z = [1.70223, 1.20223, 0.702227, 0.202227 ]
func _ready():
race_car = get_race_car()
if is_network_master():
var camera = InterpolatedCamera.new()
camera.set_target_path("../raceCar/CameraTarget")
camera.set_interpolation_enabled(true)
camera.set_speed(10)
add_child(camera)
func _physics_process(delta):
if (is_network_master()):
var current_speed_mps = race_car.get_linear_velocity().length()
var current_speed_kph = floor(current_speed_mps * 3.6)
var steer_val = 0.0
var throttle_val = 0.0
var brake_val = 0.0
if (throttle_val < 0.0):
throttle_val = 0.0
if (brake_val < 0.0):
brake_val = 0.0
# overrules for keyboard
if Input.is_action_pressed("ui_up") && current_speed_kph <= MAX_SPEED:
throttle_val = 1.0
if Input.is_action_pressed("ui_down"):
brake_val = 1.0
if Input.is_action_pressed("ui_left"):
steer_val = 1.0
elif Input.is_action_pressed("ui_right"):
steer_val = -1.0
# check if we need to be in reverse
if (had_throttle_or_brake_input == false and brake_val > 0.0 and current_speed_mps < 1.0):
had_throttle_or_brake_input = true
is_reverse = true
elif (throttle_val > 0.0 or brake_val > 0.0):
had_throttle_or_brake_input = true
else:
is_reverse = false
had_throttle_or_brake_input = false
if (is_reverse):
var swap = throttle_val
throttle_val = -brake_val
brake_val = -swap
elif (throttle_val == 0.0 and brake_val == 0.0 and current_speed_mps < 3.0):
brake_val = brake_factor
race_car.engine_force = throttle_val * MAX_ENGINE_FORCE
race_car.brake = brake_val * MAX_BRAKE_FORCE
steer_target = steer_val * MAX_STEER_ANGLE
if (steer_target < steer_angle):
steer_angle -= steer_speed * delta
if (steer_target > steer_angle):
steer_angle = steer_target
elif (steer_target > steer_angle):
steer_angle += steer_speed * delta
if (steer_target < steer_angle):
steer_angle = steer_target
race_car.steering = steer_angle
rset_unreliable("slave_steering", steer_angle)
else:
race_car.steering = slave_steering
func get_race_car():
return get_node("raceCar")
func get_road():
return get_race_car().road
func _on_raceCar_road_entered(road):
road_index = road.get_index()
position = Vector2(road_index, 0)
rset("slave_position", position)
func set_start(position:int):
get_race_car().translate(Vector3(start_offset_x[position], 0, start_offset_z[position]))

7
scripts/player/PathPlayerControls.gd → scripts/player/HumanControls.gd

@ -1,17 +1,17 @@
extends Spatial extends Spatial
var player:PathPlayerBase
var player:Player
var camera:InterpolatedCamera var camera:InterpolatedCamera
func _physics_process(delta): func _physics_process(delta):
if is_network_master() && player != null: if is_network_master() && player != null:
if player.is_out: if player.is_out:
camera.set_speed(1)
camera.set_speed(0.1)
if player.timer.get_time_left() > 0: if player.timer.get_time_left() > 0:
get_node("hud/reset").set_text(str(int(player.timer.get_time_left()))) get_node("hud/reset").set_text(str(int(player.timer.get_time_left())))
else: else:
get_node("hud/reset").set_text("reset") get_node("hud/reset").set_text("reset")
if Input.is_action_pressed("ui_select"):
if Input.is_action_pressed("ui_down"):
camera.set_speed(10) camera.set_speed(10)
player.reset() player.reset()
get_node("hud/reset").set_text("") get_node("hud/reset").set_text("")
@ -27,6 +27,7 @@ func _physics_process(delta):
func set_player(path:String): func set_player(path:String):
player = get_node(path) player = get_node(path)
get_node("inventory").set_player(player)
camera = InterpolatedCamera.new() camera = InterpolatedCamera.new()
camera.set_target_path(path + "/Path/PathFollow/raceCar/CameraTarget") camera.set_target_path(path + "/Path/PathFollow/raceCar/CameraTarget")
camera.set_interpolation_enabled(true) camera.set_interpolation_enabled(true)

58
scripts/player/HumanInventory.gd

@ -0,0 +1,58 @@
extends BaseInventory
var view:Spatial
var preview:Spatial
func _ready():
view = get_node("view")
preview = get_node("preview")
var hud_track = get_node("../hud/inventory/track")
hud_track.get_texture().set_viewport_path_in_scene(str(get_path()) + "/viewport")
connect("item_changed",self,"_on_item_changed")
func _physics_process(delta):
if is_network_master():
if player != null:
if not player.is_out && player.is_in_group("first"):
get_node("../hud/inventory").show()
if item == null:
set_item()
if preview.item:
preview.item.show()
if Input.is_action_just_pressed("ui_select"):
route.rpc("add_road", roads[type][index], get_tree().get_network_unique_id())
if Input.is_action_just_pressed("ui_navigate_left"):
type -= 1
if type < 0:
type = roads.size() -1
index = 0
set_item()
if Input.is_action_just_pressed("ui_navigate_right"):
type += 1
if type > roads.size() - 1:
type = 0
index = 0
set_item()
if Input.is_action_just_pressed("ui_navigate_down"):
index -= 1
if index < 0:
index = roads[type].size() -1
set_item()
if Input.is_action_just_pressed("ui_navigate_up"):
index += 1
if index > roads[type].size() - 1:
index = 0
set_item()
else:
get_node("../hud/inventory").hide()
if preview.item:
preview.item.hide()
func _on_item_changed(road_identifier):
if is_network_master():
if view.get_child_count() > 0:
view.remove_child(view.get_child(0))
view.add_child(item)
get_node("../hud/inventory/type").set_text(road_identifier)

18
scripts/game/preview.gd → scripts/player/InventoryPreview.gd

@ -2,20 +2,17 @@ extends Spatial
class_name Preview class_name Preview
var player:Player
var route:Route var route:Route
var item:Road var item:Road
func _ready(): func _ready():
route = get_node("../route")
remotesync func set_network_master(id:int, recursive:bool = true):
if is_network_master():
if get_child_count() > 0:
remove_child(get_child(0))
.set_network_master(id)
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")
func _on_route_road_added(road): func _on_route_road_added(road):
if (is_network_master() && item):
if is_network_master() && item:
var transform = road.get_global_transform(); var transform = road.get_global_transform();
var curve = road.get_curve() var curve = road.get_curve()
transform = transform.translated(curve.get_point_position(curve.get_point_count() -1)) transform = transform.translated(curve.get_point_position(curve.get_point_count() -1))
@ -24,14 +21,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):
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().get_node("players/" + str(get_tree().get_network_unique_id()))
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(route.get_last_road())

161
scripts/player/PathPlayerBase.gd

@ -1,161 +0,0 @@
extends Player
class_name PathPlayerBase
var MAX_SPEED:float = 0.2
var current_speed:float = 0.0
export var speed_factor:float = 0.001
export var brake_factor:float = 0.8
# nodes
var timer:Timer
var path:Path
var follow:PathFollow
var lane:int
var has_next:bool = false
var is_resetable:bool = false
var buffered_curve:Curve3D
var buffered_translate:Vector3 = Vector3(0,0,0)
var buffered_rotation:Vector3 = Vector3(0,0,0)
var last_rotation:Vector3 = Vector3(0,0,0)
var torque_penalty:Vector3
var force_penalty:Vector3
const lane_offset = [-0.085, 0.085, -0.255, 0.255 ]
func _ready():
timer = get_node("ResetTimer")
path = get_node("Path")
path.curve = path.curve.duplicate()
path.curve.set_bake_interval(0.05)
follow = get_node("Path/PathFollow")
func _physics_process(delta):
if is_network_master():
if not is_out:
follow.set_offset(follow.get_offset() + current_speed)
# curve
if has_next && (path.curve.get_point_count() == 0 || follow.get_unit_offset() >= 1.0):
has_next = false
if path.curve.get_point_count() > 0:
path.curve.clear_points()
path.curve.set_bake_interval(0.05)
for i in range(buffered_curve.get_point_count()):
var _pos = buffered_curve.get_point_position(i)
var _in = buffered_curve.get_point_in(i)
var _out = buffered_curve.get_point_out(i)
if buffered_rotation.length() != 0:
_pos = _pos.rotated(buffered_rotation.normalized(), buffered_rotation.length())
_in = _in.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.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 get_road() != null:
var road = get_road()
var penalty_index = road.penalty_index(follow.get_offset(), current_speed)
if penalty_index >= 0:
torque_penalty = road.get_torque_penalty(penalty_index)
force_penalty = road.get_force_penalty(penalty_index)
is_out = true
is_resetable = false
timer.start()
# position
check_position()
else:
var race_car = get_race_car()
race_car.get_node("ray").set_enabled(false)
if force_penalty.length() != 0:
race_car.apply_central_impulse(force_penalty * current_speed)
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)
else:
position = slave_position
func get_race_car():
return get_node("Path/PathFollow/raceCar")
func get_road():
return get_race_car().road
func _on_raceCar_road_entered(road):
buffered_curve = road.get_lane_curve(lane)
buffered_rotation = last_rotation
if path.curve.get_point_count() > 0:
buffered_translate = Util.Curve_get_last_point(path.curve)
if road.get_end_rotation().length() != 0:
last_rotation += road.get_end_rotation()
has_next = true
master func check_position():
position = Vector2(road_index, follow.get_offset())
rset("slave_position", position)
master func reset():
if is_resetable:
is_out = false
is_resetable = false
has_next = false
current_speed = 0
var race_car = get_race_car()
# todo PATH
var route = get_node("/root/world/route")
var road = race_car.road
while road.reset_index != 0:
road = route.get_road(road.get_index() - road.reset_index)
path.curve.clear_points()
force_penalty = Vector3(0,0,0)
torque_penalty = Vector3(0,0,0)
var road_before = route.get_road(road.get_index() - 1)
if road_before == null:
road_before = road
last_rotation = road_before.get_rotation()
var point = Util.Curve_get_last_point(road_before.get_lane_curve(lane))
if last_rotation.length() != 0:
point = point.rotated(last_rotation.normalized(), last_rotation.length())
buffered_translate = road_before.get_translation() + point
follow.set_transform(road.get_transform())
race_car.road = 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.get_node("ray").set_enabled(true)
func set_start(new_lane:int):
lane = new_lane
follow.set_h_offset(lane_offset[lane])
func _on_ResetTimer_timeout():
is_resetable = true

173
scripts/player/Player.gd

@ -1,36 +1,161 @@
extends Node
extends BasePlayer
class_name Player class_name Player
# player vars
export var player_color:Color
var player_name:String
var MAX_SPEED:float = 0.2
# positions
var is_out:bool = false
var position:Vector2
var road_index:int = -1
var current_speed:float = 0.0
# puppets
puppet var slave_position:Vector2
export var speed_factor:float = 0.001
export var brake_factor:float = 0.8
# nodes
var timer:Timer
var path:Path
var follow:PathFollow
var lane:int
var has_next:bool = false
var is_resetable:bool = false
var buffered_curve:Curve3D
var buffered_translate:Vector3 = Vector3(0,0,0)
var buffered_rotation:Vector3 = Vector3(0,0,0)
var last_rotation:Vector3 = Vector3(0,0,0)
var torque_penalty:Vector3
var force_penalty:Vector3
const lane_offset = [-0.085, 0.085, -0.255, 0.255 ]
func _ready():
timer = get_node("ResetTimer")
path = get_node("Path")
path.curve = path.curve.duplicate()
path.curve.set_bake_interval(0.05)
follow = get_node("Path/PathFollow")
func _physics_process(delta):
if is_network_master():
if not is_out:
follow.set_offset(follow.get_offset() + current_speed)
# curve
if has_next && (path.curve.get_point_count() == 0 || follow.get_unit_offset() >= 1.0):
has_next = false
if path.curve.get_point_count() > 0:
path.curve.clear_points()
path.curve.set_bake_interval(0.05)
for i in range(buffered_curve.get_point_count()):
var _pos = buffered_curve.get_point_position(i)
var _in = buffered_curve.get_point_in(i)
var _out = buffered_curve.get_point_out(i)
if buffered_rotation.length() != 0:
_pos = _pos.rotated(buffered_rotation.normalized(), buffered_rotation.length())
_in = _in.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.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 get_road() != null:
var road = get_road()
var penalty_index = road.penalty_index(follow.get_offset(), current_speed)
if penalty_index >= 0:
torque_penalty = road.get_torque_penalty(penalty_index)
force_penalty = road.get_force_penalty(penalty_index)
is_out = true
is_resetable = false
timer.start()
# position
check_position()
else:
var race_car = get_race_car()
race_car.get_node("ray").set_enabled(false)
if force_penalty.length() != 0:
race_car.apply_central_impulse(force_penalty * current_speed)
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)
else:
position = slave_position
func get_race_car(): func get_race_car():
pass
return get_node("Path/PathFollow/raceCar")
func get_road():
return get_race_car().road
func _on_raceCar_road_entered(road):
buffered_curve = road.get_lane_curve(lane)
buffered_rotation = last_rotation
if path.curve.get_point_count() > 0:
buffered_translate = Util.Curve_get_last_point(path.curve)
if road.get_end_rotation().length() != 0:
last_rotation += road.get_end_rotation()
has_next = true
master func check_position():
position = Vector2(road_index, follow.get_offset())
rset("slave_position", position)
master func reset():
if is_resetable:
has_next = false
current_speed = 0
var race_car = get_race_car()
# todo PATH
var route = get_node("/root/world/route")
var road = race_car.road
while road.reset_index != 0:
road = route.get_road(road.get_index() - road.reset_index)
path.curve.clear_points()
force_penalty = Vector3(0,0,0)
torque_penalty = Vector3(0,0,0)
var road_before = route.get_road(road.get_index() - 1)
if road_before == null:
road_before = road
last_rotation = road_before.get_rotation()
var point = Util.Curve_get_last_point(road_before.get_lane_curve(lane))
if last_rotation.length() != 0:
point = point.rotated(last_rotation.normalized(), last_rotation.length())
buffered_translate = road_before.get_translation() + point
func get_player_name():
return player_name
follow.set_transform(road.get_transform())
func set_player_name(new_name):
player_name = new_name
race_car.road = 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.get_node("ray").set_enabled(true)
func get_player_color():
return player_color
is_out = false
is_resetable = false
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(new_lane:int):
lane = new_lane
follow.set_h_offset(lane_offset[lane])
func set_start(position:int):
pass
func _on_ResetTimer_timeout():
is_resetable = true

114
scripts/player/inventory.gd

@ -1,114 +0,0 @@
extends Spatial
class_name Inventory
var view:Spatial
var item:Road
var type:int = 0
var index:int = 0
var route:Route
var road_straights = [
roads_factory.STRAIGHT,
roads_factory.STRAIGHT_SMALL,
roads_factory.BUMP,
roads_factory.BUMP_SMALL,
]
var roads_left = [
roads_factory.CURVE_LEFT,
roads_factory.CURVE_LARGE_LEFT,
roads_factory.CURVE_SMALL_LEFT,
roads_factory.SKEW_LEFT,
roads_factory.CURVED_LEFT,
]
var roads_right = [
roads_factory.CURVE_RIGHT,
roads_factory.CURVE_LARGE_RIGHT,
roads_factory.CURVE_SMALL_RIGHT,
roads_factory.SKEW_RIGHT,
roads_factory.CURVED_RIGHT,
]
var roads_up = [
roads_factory.RAMP_UP,
roads_factory.RAMP_CURVED_UP,
roads_factory.RAMP_SMALL_UP,
]
var roads_down = [
roads_factory.RAMP_DOWN,
roads_factory.RAMP_CURVED_DOWN,
roads_factory.RAMP_SMALL_DOWN,
]
var roads_special = [
roads_factory.LOOP,
]
var roads = [ road_straights, roads_left, roads_right, roads_up, roads_down, roads_special ]
signal item_changed(index)
func _ready():
view = get_node("view")
route = get_node("../route")
remotesync func set_network_master(id:int, recursive:bool = true):
if is_network_master():
get_node("HUD/background").hide()
get_node("HUD/track").hide()
get_node("HUD/type").hide()
.set_network_master(id)
if is_network_master():
get_node("HUD/background").show()
get_node("HUD/track").show()
get_node("HUD/type").show()
set_item()
func _process(delta):
if (is_network_master()):
if Input.is_action_just_pressed("ui_select"):
route.rpc("add_road", roads[type][index], get_tree().get_network_unique_id())
if Input.is_action_just_pressed("ui_navigate_left"):
type -= 1
if type < 0:
type = roads.size() -1
index = 0
set_item()
if Input.is_action_just_pressed("ui_navigate_right"):
type += 1
if type > roads.size() - 1:
type = 0
index = 0
set_item()
if Input.is_action_just_pressed("ui_navigate_down"):
index -= 1
if index < 0:
index = roads[type].size() -1
set_item()
if Input.is_action_just_pressed("ui_navigate_up"):
index += 1
if index > roads[type].size() - 1:
index = 0
set_item()
func set_item():
if (is_network_master()):
if item:
item.free()
if view.get_child_count() > 0:
view.remove_child(view.get_child(0))
item = roads_factory.get_road_instance(roads[type][index])
var player = get_parent().get_node("players/" + str(get_tree().get_network_unique_id()))
if player != null:
item.set_color(player.get_player_color())
view.add_child(item)
item.rotate_y(PI/2)
get_node("HUD/type").set_text(roads[type][index])
emit_signal("item_changed", roads[type][index])

94
scripts/player/player_controls.gd

@ -1,94 +0,0 @@
extends VehicleBody
export var MAX_SPEED = 200.0
export var MAX_ENGINE_FORCE = 100.0
export var MAX_BRAKE_FORCE = 15.0
export var MAX_STEER_ANGLE = 0.5
export var steer_speed = 0.5
export var brake_factor = 0.1
puppet var slave_transform = Transform()
puppet var slave_velocity = Vector3()
puppet var slave_steering = 0.0
var steer_target = 0.0
var steer_angle = 0.0
var had_throttle_or_brake_input = false
var is_reverse = false
func _physics_process(delta):
if (is_network_master()):
var current_speed_mps = get_linear_velocity().length()
var current_speed_kph = floor(current_speed_mps * 3.6)
get_node("HUD/speed").text = String(current_speed_kph) + " kph"
var steer_val = 0.0
var throttle_val = 0.0
var brake_val = 0.0
if (throttle_val < 0.0):
throttle_val = 0.0
if (brake_val < 0.0):
brake_val = 0.0
# overrules for keyboard
if Input.is_action_pressed("ui_up") && current_speed_kph <= MAX_SPEED:
throttle_val = 1.0
if Input.is_action_pressed("ui_down"):
brake_val = 1.0
if Input.is_action_pressed("ui_left"):
steer_val = 1.0
elif Input.is_action_pressed("ui_right"):
steer_val = -1.0
# check if we need to be in reverse
if (had_throttle_or_brake_input == false and brake_val > 0.0 and current_speed_mps < 1.0):
had_throttle_or_brake_input = true
is_reverse = true
elif (throttle_val > 0.0 or brake_val > 0.0):
had_throttle_or_brake_input = true
else:
is_reverse = false
had_throttle_or_brake_input = false
if (is_reverse):
var swap = throttle_val
throttle_val = -brake_val
brake_val = -swap
elif (throttle_val == 0.0 and brake_val == 0.0 and current_speed_mps < 3.0):
brake_val = brake_factor
engine_force = throttle_val * MAX_ENGINE_FORCE
brake = brake_val * MAX_BRAKE_FORCE
steer_target = steer_val * MAX_STEER_ANGLE
if (steer_target < steer_angle):
steer_angle -= steer_speed * delta
if (steer_target > steer_angle):
steer_angle = steer_target
elif (steer_target > steer_angle):
steer_angle += steer_speed * delta
if (steer_target < steer_angle):
steer_angle = steer_target
steering = steer_angle
rset_unreliable("slave_transform", get_global_transform())
rset_unreliable("slave_velocity", get_linear_velocity())
rset_unreliable("slave_steering", steer_angle)
else:
set_global_transform(slave_transform)
set_linear_velocity(slave_velocity)
steering = slave_steering
func set_color(new_color):
for i in range(get_node("body").get_surface_count()):
var material = get_node("body").surface_get_material(i)
var albedo = material.get_shader_param("albedo")
albedo.color = new_color
Loading…
Cancel
Save