small racing game im working on
Diffstat (limited to 'race.gd')
-rw-r--r--race.gd40
1 files changed, 26 insertions, 14 deletions
diff --git a/race.gd b/race.gd
index 978e8dd..0404cc9 100644
--- a/race.gd
+++ b/race.gd
@@ -5,15 +5,18 @@ extends Node3D
@export var track: TrackLoader
@export var splits: Control
@export var timer: Control
-@onready var data := TrackSaveableData.new(track.checkpoints.size())
+@onready var data := TrackSaveableData.new(track.checkpoints.size(), track.track.laps)
@onready var best_time_data := TrackSaveableData._load(saves % track.track.name)
var car: Car
var ghost: GhostCar
+var current_lap := 0
var start_frame: int
+var playing := false
const SaveLoad := preload("res://addons/@bendn/remap/private/SaveLoadUtils.gd")
const saves := "user://%s.trackdata"
+signal next_lap
signal created_car(car: Car)
signal finished
@@ -42,21 +45,29 @@ func _ready() -> void:
created_car.emit(car)
print("car created")
for i in len(track.checkpoints):
- track.checkpoints[i].collected.connect(collect.bind(i))
+ track.checkpoints[i].collected.connect(
+ (func passed_cp(cp: int) -> void: if playing and data.checkpoints[current_lap][i] < 0: collect(cp))
+ .bind(i))
track.finish.collected.connect(
func passed_finish() -> void:
- for t in data.checkpoints: # no any() function on packedfloat32
- if t < 0:
+ if !playing: return
+ for i in len(data.checkpoints[current_lap]) - 1: # no any() function on packedfloat32
+ if data.checkpoints[current_lap][i] < 0:
return
collect(-1)
- finished.emit()
- print("finished")
- if not best_time_data or data.time < best_time_data.time:
- print("new pb!")
- SaveLoad.save(saves % track.track.name, data.data())
- # best_time_data = data # this messes with the ghost, and doesnt matter yet anyways (until i can reset)
- data = TrackSaveableData.new(track.checkpoints.size())
+ if not track.track.laps or track.track.laps - 1 == current_lap:
+ finished.emit()
+ playing = false
+ print("finished")
+ if not best_time_data or data.time < best_time_data.time:
+ print("new pb!")
+ SaveLoad.save(saves % track.track.name, data.data())
+ # best_time_data = data # this messes with the ghost, and doesnt matter yet anyways (until i can reset)
+ data = TrackSaveableData.new(track.checkpoints.size())
+ else:
+ current_lap += 1
+ next_lap.emit()
)
func _physics_process(_delta: float) -> void:
@@ -73,12 +84,13 @@ func _physics_process(_delta: float) -> void:
func collect(cp: int) -> void:
- var time := best_time_data.checkpoints[cp] if best_time_data else -1.0
- time = best_time_data.time if cp == -1 and time != -1.0 else time
+ var time := best_time_data.get_time(current_lap, cp) if best_time_data else -1.0
+ time = best_time_data.time if (not track.track.laps or track.track.laps == current_lap + 1) and cp == -1 and time != -1.0 else time
splits.update(timer.now(), time)
- data.collect(cp, timer.now())
+ data.collect(current_lap, cp, timer.now())
func _on_intro_camera_race_started() -> void:
start_frame = Engine.get_physics_frames()
+ playing = true
set_physics_process(true)