Browse Source
added basic bots, code clean up, fixed reset path, added patreon link
added basic bots, code clean up, fixed reset path, added patreon link
27 changed files with 492 additions and 807 deletions
-
2README.md
-
18project.godot
-
14scenes/debug/PathFollow.tscn
-
13scenes/game/world.tscn
-
8scenes/lobby/lobby.tscn
-
10scenes/player/BotPlayer.tscn
-
100scenes/player/FullPlayer.tscn
-
97scenes/player/HumanPlayer.tscn
-
6scenes/player/PathPlayerBot.tscn
-
34scenes/player/PathPlayerControls.tscn
-
16scenes/player/Player.tscn
-
56scenes/player/inventory.tscn
-
31scripts/game/game_state.gd
-
13scripts/game/world.gd
-
6scripts/lobby/lobby.gd
-
71scripts/player/BaseInventory.gd
-
42scripts/player/BasePlayer.gd
-
3scripts/player/BotControls.gd
-
19scripts/player/BotInventory.gd
-
105scripts/player/FullPlayer.gd
-
7scripts/player/HumanControls.gd
-
58scripts/player/HumanInventory.gd
-
18scripts/player/InventoryPreview.gd
-
161scripts/player/PathPlayerBase.gd
-
173scripts/player/Player.gd
-
114scripts/player/inventory.gd
-
94scripts/player/player_controls.gd
@ -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 |
@ -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 ) |
@ -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"] |
@ -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 ) |
@ -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 ) |
@ -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 |
@ -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 ) |
@ -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]) |
@ -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") |
@ -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") |
@ -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])) |
@ -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) |
@ -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 |
@ -1,36 +1,161 @@ |
|||
extends Node |
|||
extends BasePlayer |
|||
|
|||
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(): |
|||
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 |
@ -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]) |
@ -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 |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue