small racing game im working on
-rw-r--r--classes/trackdata.gd32
-rw-r--r--project.godot2
-rw-r--r--race.gd4
-rw-r--r--ui/tracks.gd2
4 files changed, 26 insertions, 14 deletions
diff --git a/classes/trackdata.gd b/classes/trackdata.gd
index 77d5600..bac1297 100644
--- a/classes/trackdata.gd
+++ b/classes/trackdata.gd
@@ -1,8 +1,6 @@
class_name TrackSaveableData
extends Resource
-const SaveLoad := preload("res://addons/@bendn/remap/private/SaveLoadUtils.gd")
-
var time: float
var checkpoints: Array#[PackedFloat32Array]
var positional := {
@@ -12,8 +10,8 @@ var positional := {
snaps = 0,
}
-func data() -> Dictionary:
- return ({time = time, checkpoints = checkpoints, positional = positional})
+func save(path: String) -> void:
+ _save_file(path, {checkpoints = checkpoints, positional = positional, time = time})
func _init(num_checkpoints := 0, laps := 0) -> void:
for i in laps:
@@ -35,7 +33,7 @@ func get_time(lap: int, cp: int) -> float:
func snapshot(obj: Car) -> void:
positional.origins.append(obj.global_position)
positional.rotations.append(obj.global_rotation)
- positional.steering.append(obj.steering)
+ positional.steering.append(snappedf(obj.steering, .1)) # FastLZ benefits from repetition
positional.snaps += 1
func loadshot(frame: int) -> Array:
@@ -45,16 +43,32 @@ func snaps() -> int:
return positional.snaps
static func from_d(d: Dictionary) -> TrackSaveableData:
- if !d.has_all(["checkpoints", "positional", "time"]) and d.positional.has_all(["origins", "rotations", "steering", "snaps"]):
- return null
var obj := TrackSaveableData.new(0)
- obj.checkpoints = d.checkpoints
obj.time = d.time
+ obj.checkpoints = d.checkpoints
obj.positional = d.positional
return obj
+
+## Saves a basic dictionary to a path.
+static func _save_file(path: String, data: Dictionary) -> void:
+ var file := FileAccess.open_compressed(path, FileAccess.WRITE, FileAccess.COMPRESSION_FASTLZ)
+ file.store_buffer(var_to_bytes(data))
+
+## Loads a basic dictionary out of a file.
+static func _load_file(path: String) -> Dictionary:
+ if FileAccess.file_exists(path):
+ var file := FileAccess.open_compressed(path, FileAccess.READ, FileAccess.COMPRESSION_FASTLZ)
+ var text := file.get_buffer(file.get_length())
+ var dict := {}
+ if text:
+ dict = bytes_to_var(text)
+ return dict
+ _save_file(path, {}) # create file if it doesn't exist
+ return {}
+
static func _load(path: String) -> TrackSaveableData:
- var res := SaveLoad.load_file(path)
+ var res := _load_file(path)
if res.is_empty():
return null
return TrackSaveableData.from_d(res)
diff --git a/project.godot b/project.godot
index 8491c99..f60912d 100644
--- a/project.godot
+++ b/project.godot
@@ -14,7 +14,7 @@ config/name="tracer"
run/main_scene="res://start.tscn"
config/use_custom_user_dir=true
config/custom_user_dir_name="tracer"
-config/features=PackedStringArray("4.0")
+config/features=PackedStringArray("4.1")
[autoload]
diff --git a/race.gd b/race.gd
index 385ab34..2848ed0 100644
--- a/race.gd
+++ b/race.gd
@@ -85,8 +85,7 @@ func passed_finish() -> void:
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())
- data = TrackSaveableData.new(track.checkpoints.size())
+ data.save(saves % track_res.name)
else:
current_lap += 1
next_lap.emit()
@@ -103,7 +102,6 @@ func _physics_process(_delta: float) -> void:
ghost.update(shot[0], shot[1], shot[2])
ghost.visible = (ghost.global_position.distance_squared_to(car.global_position) > 10)
-
func collect(cp: int) -> void:
if cp != -1:
car.checkpoint_sound.play()
diff --git a/ui/tracks.gd b/ui/tracks.gd
index 048167a..2f9d0ec 100644
--- a/ui/tracks.gd
+++ b/ui/tracks.gd
@@ -14,4 +14,4 @@ func _ready() -> void:
func track_selected(track: TrackResource) -> void:
print("play %s" % track.name)
Globals.playing = track
- get_tree().change_scene_to_packed(race) \ No newline at end of file
+ get_tree().change_scene_to_packed(race)