small racing game im working on
add a new track
bendn 2023-02-16
parent 70b4b8b · commit 014682c
-rw-r--r--cam.gd3
-rw-r--r--classes/car.gd21
-rw-r--r--classes/track.gd6
-rw-r--r--project.godot8
-rw-r--r--race.gd14
-rw-r--r--race.tscn21
-rw-r--r--scenes/race_high.tscn10
-rw-r--r--scenes/race_highlevel.gd9
-rw-r--r--scenes/track-base.gd10
-rw-r--r--scenes/track.tscn67
-rw-r--r--start.tscn5
-rw-r--r--tracks/multilap_test.tres4
-rw-r--r--tracks/test.tres4
-rw-r--r--tracks/the fallen tramps.tres36
-rw-r--r--tracks/the fallen tramps_curve.tres8
15 files changed, 134 insertions, 92 deletions
diff --git a/cam.gd b/cam.gd
index f3e5625..213d446 100644
--- a/cam.gd
+++ b/cam.gd
@@ -2,7 +2,7 @@ extends Camera3D
class_name CarCamera
@export var target_distance = 9.0
-@export var target_height = 4.0
+@export var target_height = 6.0
var follow_this: Node3D
var last_lookat: Vector3
@@ -11,6 +11,7 @@ func _ready():
global_position = follow_this.global_position + (follow_this.global_transform.basis.z * target_distance)
look_at(follow_this.global_position)
last_lookat = follow_this.global_position
+ far = 2000
func target() -> Vector3:
var delta_v := global_position - follow_this.global_position
diff --git a/classes/car.gd b/classes/car.gd
index 5ecd629..2bef84d 100644
--- a/classes/car.gd
+++ b/classes/car.gd
@@ -38,12 +38,10 @@ func steer(to: float) -> void:
right_wheel.rotation.y = _steering * .75
left_wheel.rotation.y = _steering * .75
-func move_mesh(delta: float) -> void:
- # just lerp the y due to trimesh bouncing
- car_mesh.global_position.x = ball.global_position.x + sphere_offset.x
- car_mesh.global_position.z = ball.global_position.z + sphere_offset.z
- car_mesh.global_position.y = lerp(car_mesh.global_position.y, ball.global_position.y + sphere_offset.y, 10 * delta)
- if !ball.freeze:
+func move_mesh(_delta: float) -> void:
+ car_mesh.global_position.x = ball.global_position.x + sphere_offset.x
+ car_mesh.global_position.z = ball.global_position.z + sphere_offset.z
+ car_mesh.global_position.y = ball.global_position.y + sphere_offset.y
ball.apply_central_force(-car_mesh.global_transform.basis.z * throttle)
func turn(delta: float) -> void:
@@ -74,19 +72,16 @@ func limit(delta: float) -> void:
func _physics_process(delta: float) -> void:
move_mesh(delta)
- # if not ground_ray.is_colliding():
- # return
-
- # print(ball.linear_velocity.normalized().dot(-car_mesh.transform.basis.y))
- # if throttle < 0 && :
- # steering = -steering
+ limit(delta)
+ if not ground_ray.is_colliding():
+ turn(delta/10)
+ return
# drift particles
var drift: bool = kph() > 25 and abs(ball.linear_velocity.normalized().dot(-car_mesh.transform.basis.z)) > .5
skid_l.emitting = drift
skid_r.emitting = drift
- limit(delta)
turn(delta)
floor_mesh(delta)
diff --git a/classes/track.gd b/classes/track.gd
index 9764ccc..4e53f3d 100644
--- a/classes/track.gd
+++ b/classes/track.gd
@@ -2,11 +2,11 @@ extends Resource
class_name TrackResource
@export_group("Road")
## Width of road
-@export var track_width := 17.0
+@export var track_width := 40.0
## Distance between rails and road
@export var rail_distance := 3.0
## Support base width
-@export var lower_support_width := 15.0
+@export var lower_support_width := 25.0
## Height of supports
@export var support_height := 8.0
## Track curve
@@ -35,7 +35,7 @@ class_name TrackResource
@export var laps := 1
@export_subgroup("Checkpoints")
## Place the path offsets of checkpoint locations in this array
-@export var checkpoints: PackedFloat32Array = []
+@export var checkpoints: Array[float] = []
## The checkpoint scene
@export var checkpoint_scene: PackedScene = preload("res://scenes/ring_checkpoint.tscn")
## How much to scale each checkpoint
diff --git a/project.godot b/project.godot
index 8bc881f..b9ce718 100644
--- a/project.godot
+++ b/project.godot
@@ -73,17 +73,15 @@ accel={
"deadzone": 0.5,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":5,"axis_value":1.0,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null)
]
}
brake={
"deadzone": 0.5,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":4,"axis_value":1.0,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null)
-]
-}
-shift_up={
-"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":false,"script":null)
]
}
shift_down={
diff --git a/race.gd b/race.gd
index d0af4dd..5729b2e 100644
--- a/race.gd
+++ b/race.gd
@@ -1,11 +1,10 @@
extends Node3D
class_name Race
-@export var car_scene: PackedScene
-@export var ghost_scene: PackedScene
-@export var track_loader_scene: PackedScene
-
# in order of initialization
+var car_scene: PackedScene
+var track_loader_scene: PackedScene
+var ghost_scene: PackedScene
var track_res: TrackResource
var track: TrackLoader
var data: TrackSaveableData
@@ -27,7 +26,10 @@ signal created_ghost(ghost: GhostCar)
signal finished
signal split(time: float, prev_time: float)
-func initialize(t: TrackResource) -> void:
+func _init(t: TrackResource, _car_scene, _ghost_scene, _track_loader_scene) -> void:
+ car_scene = _car_scene
+ ghost_scene = _ghost_scene
+ track_loader_scene = _track_loader_scene
track_res = t
func mkghost() -> void:
@@ -45,7 +47,6 @@ func mkcar() -> void:
car.visible = false
add_child(car)
car.rotation = track.start_rot + Vector3(0, PI, -PI/2)
- # car.set_deferred(&"rotation", track.start_rot + Vector3(0, PI, -PI/2))
car.global_position = track.start_pos + Vector3(0, 2, 0) - (car.ball.global_transform.basis.z * 2) # bump forward a teensy bit
car.visible = true
created_car.emit(car)
@@ -81,6 +82,7 @@ func passed_finish() -> void:
finished.emit()
playing = false
print("finished")
+ timer.stop()
if not best_time_data or data.time < best_time_data.time:
print("new pb!")
SaveLoad.save(saves % track_res.name, data.data())
diff --git a/race.tscn b/race.tscn
deleted file mode 100644
index cc6034e..0000000
--- a/race.tscn
+++ /dev/null
@@ -1,21 +0,0 @@
-[gd_scene load_steps=8 format=3 uid="uid://cech6c4yrmcvq"]
-
-[ext_resource type="Script" path="res://race.gd" id="1_ckbwd"]
-[ext_resource type="Environment" uid="uid://biwshm46yl62v" path="res://default_env.tres" id="2_pnp7e"]
-[ext_resource type="PackedScene" uid="uid://bbj2agqv581cd" path="res://assets/cars/kenney_sedan/sedan.blend" id="3_cb3p0"]
-[ext_resource type="CameraAttributesPractical" uid="uid://nhsovwj5hjip" path="res://cam.tres" id="3_jx550"]
-[ext_resource type="PackedScene" uid="uid://ccn1nk1a0b0sa" path="res://assets/cars/kenney_sedan/sedan.tscn" id="6_nu32e"]
-[ext_resource type="PackedScene" uid="uid://cd4a5y0hi58ks" path="res://scenes/floor.tscn" id="10_p60d8"]
-[ext_resource type="PackedScene" uid="uid://clw61td2wh84w" path="res://scenes/track.tscn" id="11_6q53c"]
-
-[node name="race" type="Node3D"]
-script = ExtResource("1_ckbwd")
-car_scene = ExtResource("6_nu32e")
-ghost_scene = ExtResource("3_cb3p0")
-track_loader_scene = ExtResource("11_6q53c")
-
-[node name="Env" type="WorldEnvironment" parent="."]
-environment = ExtResource("2_pnp7e")
-camera_attributes = ExtResource("3_jx550")
-
-[node name="Ground" parent="." instance=ExtResource("10_p60d8")]
diff --git a/scenes/race_high.tscn b/scenes/race_high.tscn
index 3c2a1a9..0c0bb38 100644
--- a/scenes/race_high.tscn
+++ b/scenes/race_high.tscn
@@ -1,15 +1,19 @@
-[gd_scene load_steps=5 format=3 uid="uid://calx1puxr4eng"]
+[gd_scene load_steps=7 format=3 uid="uid://calx1puxr4eng"]
[ext_resource type="Script" path="res://scenes/race_highlevel.gd" id="1_q8hua"]
-[ext_resource type="PackedScene" uid="uid://cech6c4yrmcvq" path="res://race.tscn" id="2_q333e"]
+[ext_resource type="PackedScene" uid="uid://ccn1nk1a0b0sa" path="res://assets/cars/kenney_sedan/sedan.tscn" id="3_cfvv6"]
[ext_resource type="PackedScene" uid="uid://vok7fdcyec68" path="res://ui/hud.tscn" id="3_xp6f0"]
[ext_resource type="PackedScene" uid="uid://clpo7rt0vkudy" path="res://ui/countdown.tscn" id="4_llox4"]
+[ext_resource type="PackedScene" uid="uid://bbj2agqv581cd" path="res://assets/cars/kenney_sedan/sedan.blend" id="4_waubg"]
+[ext_resource type="PackedScene" uid="uid://clw61td2wh84w" path="res://scenes/track.tscn" id="5_8mqbt"]
[node name="race_high" type="Node"]
script = ExtResource("1_q8hua")
-race_scene = ExtResource("2_q333e")
hud_scene = ExtResource("3_xp6f0")
countdown_scene = ExtResource("4_llox4")
+car_scene = ExtResource("3_cfvv6")
+ghost_scene = ExtResource("4_waubg")
+track_loader_scene = ExtResource("5_8mqbt")
[node name="tester" type="ColorRect" parent="."]
custom_minimum_size = Vector2(1920, 1038)
diff --git a/scenes/race_highlevel.gd b/scenes/race_highlevel.gd
index 904a00b..00c84cb 100644
--- a/scenes/race_highlevel.gd
+++ b/scenes/race_highlevel.gd
@@ -1,15 +1,18 @@
extends Splitscreen
-@export var race_scene: PackedScene
@export var hud_scene: PackedScene
@export var countdown_scene: PackedScene
+## For lowlevel race
+@export var car_scene: PackedScene
+@export var ghost_scene: PackedScene
+@export var track_loader_scene: PackedScene
+
var race: Race
var huds: Array[HUD]
func _ready() -> void:
- race = race_scene.instantiate()
- race.initialize(Globals.playing)
+ race = Race.new(Globals.playing, car_scene, ghost_scene, track_loader_scene)
add_child(race)
add_player()
super()
diff --git a/scenes/track-base.gd b/scenes/track-base.gd
index bffb716..96f9e40 100644
--- a/scenes/track-base.gd
+++ b/scenes/track-base.gd
@@ -22,6 +22,7 @@ class_name TrackLoader
@onready var rail_r := $"Rail-R" as CSGPolygon3D
@onready var collision := $CollisionShape as CSGPolygon3D
@onready var sun := $Sun as DirectionalLight3D
+@onready var ground := $Ground as StaticBody3D
var checkpoints: Array[CheckPoint]
var finish: Finish
@@ -94,9 +95,6 @@ func _update():
vec(-rp - 3.0, 5.0),
vec(-rp, 5.0),
])
- # offset
- position = track.offset
-
# objects
for child in get_children():
if child is PathFollow3D:
@@ -115,7 +113,6 @@ func _update():
else:
start_pos = finish.global_position
start_rot = finish.global_rotation
- start_rot = start_rot.snapped(Vector3(PI/2, PI/2, PI/2))
# loopage
rail_l.path_joined = track.is_loop
@@ -124,6 +121,9 @@ func _update():
road.path_joined = track.is_loop
support.path_joined = track.is_loop
+ # offset
+ ground.global_position = track.offset
+
is_dirty = false
func _ready():
@@ -139,4 +139,4 @@ func make_follower(scene: PackedScene, ratio: float, scl: Vector3, collide: bool
add_child(follower)
follower.scale = scl
follower.progress_ratio = ratio # ratio set must be after add_child()
- return follower \ No newline at end of file
+ return follower
diff --git a/scenes/track.tscn b/scenes/track.tscn
index 074ce0b..477d253 100644
--- a/scenes/track.tscn
+++ b/scenes/track.tscn
@@ -1,16 +1,23 @@
-[gd_scene load_steps=5 format=3 uid="uid://clw61td2wh84w"]
+[gd_scene load_steps=10 format=3 uid="uid://clw61td2wh84w"]
[ext_resource type="Script" path="res://scenes/track-base.gd" id="1_ke7nx"]
+[ext_resource type="Curve3D" uid="uid://2d8xnh5nyjq8" path="res://tracks/the fallen tramps_curve.tres" id="1_obdfl"]
[ext_resource type="Material" uid="uid://be8pta62kxd2j" path="res://assets/mats/road.tres" id="2_2nntu"]
[ext_resource type="Material" uid="uid://dtpgjplswm6lr" path="res://assets/mats/rail.tres" id="2_3pcob"]
[ext_resource type="Material" uid="uid://bk4sxd2prmmom" path="res://assets/mats/support.tres" id="3_4570s"]
+[ext_resource type="Resource" uid="uid://crtutccbf1sxh" path="res://tracks/the fallen tramps.tres" id="3_avtir"]
+[ext_resource type="PackedScene" uid="uid://cd4a5y0hi58ks" path="res://scenes/floor.tscn" id="7_fidh3"]
+[ext_resource type="Environment" uid="uid://biwshm46yl62v" path="res://default_env.tres" id="8_2nyv3"]
+[ext_resource type="CameraAttributesPractical" uid="uid://nhsovwj5hjip" path="res://cam.tres" id="9_6ooo5"]
[node name="TrackLoader" type="Path3D"]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.70198, -8.01861, -4.84379)
+curve = ExtResource("1_obdfl")
script = ExtResource("1_ke7nx")
+track = ExtResource("3_avtir")
+metadata/_edit_group_ = true
[node name="Road" type="CSGPolygon3D" parent="."]
-polygon = PackedVector2Array(-8.5, 0, -8.5, -0.1, 8.5, -0.1, 8.5, 0)
+polygon = PackedVector2Array(-20, 0, -20, -0.1, 20, -0.1, 20, 0)
mode = 2
path_node = NodePath("..")
path_interval_type = 0
@@ -20,66 +27,74 @@ path_rotation = 2
path_local = false
path_continuous_u = true
path_u_distance = 0.0
-path_joined = true
+path_joined = false
material = ExtResource("2_2nntu")
-[node name="CollisionShape" type="CSGPolygon3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.165113, 0)
-visible = false
-use_collision = true
-polygon = PackedVector2Array(-11.5, 0, 11.5, 0, 11.5, 5, 14.5, 5, 14.5, -1, -14.5, -1, -14.5, 5, -11.5, 5)
+[node name="Rail-L" type="CSGPolygon3D" parent="."]
+polygon = PackedVector2Array(23, 0.5, 22.95, 0.47, 22.95, 0.43, 23, 0.4, 23, 0.55, 22.95, 0.32, 22.95, 0.28, 23, 0.25, 23.05, 0.25, 23.05, 0.5)
mode = 2
path_node = NodePath("..")
path_interval_type = 0
path_interval = 1.0
-path_simplify_angle = 3.0
+path_simplify_angle = 4.0
path_rotation = 2
path_local = false
path_continuous_u = true
path_u_distance = 1.0
-path_joined = true
+path_joined = false
+material = ExtResource("2_3pcob")
-[node name="Rail-L" type="CSGPolygon3D" parent="."]
-polygon = PackedVector2Array(11.5, 0.5, 11.45, 0.47, 11.45, 0.43, 11.5, 0.4, 11.5, 0.55, 11.45, 0.32, 11.45, 0.28, 11.5, 0.25, 11.55, 0.25, 11.55, 0.5)
+[node name="Rail-R" type="CSGPolygon3D" parent="."]
+polygon = PackedVector2Array(-23, 0.5, -22.95, 0.47, -22.95, 0.43, -23, 0.4, -23, 0.55, -22.95, 0.32, -22.95, 0.28, -23, 0.25, -23.05, 0.25, -23.05, 0.5)
mode = 2
path_node = NodePath("..")
path_interval_type = 0
path_interval = 1.0
-path_simplify_angle = 2.0
+path_simplify_angle = 4.0
path_rotation = 2
path_local = false
path_continuous_u = true
path_u_distance = 1.0
-path_joined = true
-material = ExtResource("2_3pcob")
+path_joined = false
-[node name="Rail-R" type="CSGPolygon3D" parent="."]
-polygon = PackedVector2Array(-11.5, 0.5, -11.45, 0.47, -11.45, 0.43, -11.5, 0.4, -11.5, 0.55, -11.45, 0.32, -11.45, 0.28, -11.5, 0.25, -11.55, 0.25, -11.55, 0.5)
+[node name="Support" type="CSGPolygon3D" parent="."]
+polygon = PackedVector2Array(-22, -1, 22, -1, 25.1, -2, -25, -2)
mode = 2
path_node = NodePath("..")
path_interval_type = 0
path_interval = 1.0
-path_simplify_angle = 2.0
+path_simplify_angle = 5.0
path_rotation = 2
path_local = false
path_continuous_u = true
path_u_distance = 1.0
-path_joined = true
+path_joined = false
+material = ExtResource("3_4570s")
-[node name="Support" type="CSGPolygon3D" parent="."]
-polygon = PackedVector2Array(-10.5, -0.17, 10.5, -0.17, 15.1, -8, -15, -8)
+[node name="Sun" type="DirectionalLight3D" parent="."]
+transform = Transform3D(-0.992546, -0.0211624, 0.120018, -4.42191e-09, 0.984808, 0.173648, -0.121869, 0.172354, -0.977467, 0, 0, 0)
+
+[node name="Env" type="WorldEnvironment" parent="."]
+environment = ExtResource("8_2nyv3")
+camera_attributes = ExtResource("9_6ooo5")
+
+[node name="CollisionShape" type="CSGPolygon3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.165113, 0)
+visible = false
+use_collision = true
+polygon = PackedVector2Array(-23, 0, 23, 0, 23, 5, 26, 5, 26, -1, -26, -1, -26, 5, -23, 5)
mode = 2
path_node = NodePath("..")
path_interval_type = 0
path_interval = 1.0
-path_simplify_angle = 3.0
+path_simplify_angle = 5.0
path_rotation = 2
path_local = false
path_continuous_u = true
path_u_distance = 1.0
-path_joined = true
-material = ExtResource("3_4570s")
+path_joined = false
-[node name="Sun" type="DirectionalLight3D" parent="."]
+[node name="Ground" parent="." instance=ExtResource("7_fidh3")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -200, 0)
[connection signal="curve_changed" from="." to="." method="_on_curve_changed"]
diff --git a/start.tscn b/start.tscn
index eb0c68a..cc1ef0f 100644
--- a/start.tscn
+++ b/start.tscn
@@ -1,10 +1,11 @@
-[gd_scene load_steps=6 format=3 uid="uid://bvfqaoqjsxj73"]
+[gd_scene load_steps=7 format=3 uid="uid://bvfqaoqjsxj73"]
[ext_resource type="Theme" uid="uid://ch2uo5qd8ubx6" path="res://ui/theme.tres" id="1_gm0ws"]
[ext_resource type="Script" path="res://ui/tracks.gd" id="2_po2ce"]
[ext_resource type="Resource" uid="uid://crye0ijvmtsyb" path="res://tracks/multilap_test.tres" id="3_0yjp1"]
[ext_resource type="Resource" uid="uid://de46bcu1ivmtq" path="res://tracks/test.tres" id="4_3xqvr"]
[ext_resource type="PackedScene" uid="uid://calx1puxr4eng" path="res://scenes/race_high.tscn" id="5_m5kci"]
+[ext_resource type="Resource" uid="uid://crtutccbf1sxh" path="res://tracks/the fallen tramps.tres" id="5_qwie6"]
[node name="start" type="Control"]
layout_mode = 3
@@ -39,5 +40,5 @@ theme_override_constants/h_separation = 15
theme_override_constants/v_separation = 15
columns = 5
script = ExtResource("2_po2ce")
-tracks = Array[Resource("res://classes/track.gd")]([ExtResource("3_0yjp1"), ExtResource("4_3xqvr")])
+tracks = Array[Resource("res://classes/track.gd")]([ExtResource("3_0yjp1"), ExtResource("4_3xqvr"), ExtResource("5_qwie6")])
race = ExtResource("5_m5kci")
diff --git a/tracks/multilap_test.tres b/tracks/multilap_test.tres
index 8c7c586..298fba4 100644
--- a/tracks/multilap_test.tres
+++ b/tracks/multilap_test.tres
@@ -21,9 +21,9 @@ sun_y = 0
overview_height = 250.0
name = "multilap test"
is_loop = true
-offset = Vector3(0, 1, 0)
+offset = Vector3(0, -2, 0)
laps = 3
-checkpoints = [0.2, 0.6]
+checkpoints = Array[float]([0.2, 0.6])
checkpoint_scene = ExtResource("1_ehf5p")
checkpoint_scale = Vector3(1, 1, 1)
checkpoint_needs_collision = true
diff --git a/tracks/test.tres b/tracks/test.tres
index 1214bfe..b30bdca 100644
--- a/tracks/test.tres
+++ b/tracks/test.tres
@@ -20,9 +20,9 @@ sun_y = 0
overview_height = 200.0
name = "test"
is_loop = false
-offset = Vector3(0, 1, 0)
+offset = Vector3(0, -2, 0)
laps = 1
-checkpoints = [0.5]
+checkpoints = Array[float]([0.5])
checkpoint_scene = ExtResource("1_ra7ed")
checkpoint_scale = Vector3(0.4, 0.4, 0.4)
checkpoint_needs_collision = true
diff --git a/tracks/the fallen tramps.tres b/tracks/the fallen tramps.tres
new file mode 100644
index 0000000..ed4cfb6
--- /dev/null
+++ b/tracks/the fallen tramps.tres
@@ -0,0 +1,36 @@
+[gd_resource type="Resource" script_class="TrackResource" load_steps=6 format=3 uid="uid://crtutccbf1sxh"]
+
+[ext_resource type="PackedScene" uid="uid://d4a3e1w62m3ck" path="res://scenes/ring_checkpoint.tscn" id="1_i8s2b"]
+[ext_resource type="PackedScene" uid="uid://t8ywjcjgw322" path="res://scenes/ring_finish.tscn" id="2_107h2"]
+[ext_resource type="Script" path="res://classes/track.gd" id="3_8gwjo"]
+[ext_resource type="PackedScene" uid="uid://bsftidvcmsha0" path="res://scenes/ring_start.tscn" id="4_7opiu"]
+[ext_resource type="Curve3D" uid="uid://2d8xnh5nyjq8" path="res://tracks/the fallen tramps_curve.tres" id="5_r5vwn"]
+
+[resource]
+script = ExtResource("3_8gwjo")
+track_width = 40.0
+rail_distance = 3.0
+lower_support_width = 25.0
+support_height = 2.0
+track = ExtResource("5_r5vwn")
+left_barrier = true
+right_barrier = true
+sun_x = -10
+sun_y = 173
+overview_height = 500.0
+name = "the fallen tramps"
+is_loop = false
+offset = Vector3(0, -200, 0)
+laps = 1
+checkpoints = Array[float]([0.3, 0.65])
+checkpoint_scene = ExtResource("1_i8s2b")
+checkpoint_scale = Vector3(1, 1, 1)
+checkpoint_needs_collision = true
+finish_location = 1.0
+finish_scene = ExtResource("2_107h2")
+finish_scale = Vector3(3, 3, 3)
+finish_needs_collision = true
+start_location = 0.02
+start_scene = ExtResource("4_7opiu")
+start_scale = Vector3(1, 1, 1)
+start_needs_collision = true
diff --git a/tracks/the fallen tramps_curve.tres b/tracks/the fallen tramps_curve.tres
new file mode 100644
index 0000000..a58956a
--- /dev/null
+++ b/tracks/the fallen tramps_curve.tres
@@ -0,0 +1,8 @@
+[gd_resource type="Curve3D" format=3 uid="uid://2d8xnh5nyjq8"]
+
+[resource]
+_data = {
+"points": PackedVector3Array(37.391, -10.7008, -37.7107, -37.391, 10.7008, 37.7107, 330.708, 88.7112, -74.4047, 84.4839, 47.4017, -49.9644, -82.8519, -46.486, 48.9991, 111.976, 8.1174, 38.3802, 126.492, -39.8907, 104.311, -126.492, 39.8907, -104.311, -131.577, 4, 139.526, 1.75706, -40.5922, 55.4782, -1.75706, 40.5922, -55.4782, -70.4745, -12.0589, -102.896, 9.32288, 2.08416, 54.7418, 0, 0, 0, -45.7354, -31.2662, -198.668),
+"tilts": PackedFloat32Array(1.5708, 0, 0, 0, 0)
+}
+point_count = 5