small racing game im working on
| -rw-r--r-- | classes/trackdata.gd | 32 | ||||
| -rw-r--r-- | project.godot | 2 | ||||
| -rw-r--r-- | race.gd | 4 | ||||
| -rw-r--r-- | ui/tracks.gd | 2 |
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] @@ -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) |