small racing game im working on
Diffstat (limited to 'classes/resources/ghost_data.gd')
| -rw-r--r-- | classes/resources/ghost_data.gd | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/classes/resources/ghost_data.gd b/classes/resources/ghost_data.gd new file mode 100644 index 0000000..7be0426 --- /dev/null +++ b/classes/resources/ghost_data.gd @@ -0,0 +1,79 @@ +class_name GhostData +extends Resource + +var time: float +var checkpoints: Array +# i hope this is performant +var snaps: Array#[Dictionary] +var snap_count := 0 + +func snapshot(obj: Car): + snaps.append(CarVars.new(obj).to_dict()) + snap_count += 1 + +## returns a CarVars dictionary +func load_snap(i: int) -> Dictionary: + return snaps[i] + +func save(path: String) -> void: + GhostData._save_file(path, {checkpoints = checkpoints, time = time, snaps = snaps, snap_count = snap_count}) + +func _init(num_checkpoints := 0, laps := 0) -> void: + for i in laps: + var arr := [] + arr.resize(num_checkpoints + 1) + arr.fill(-1) + checkpoints.append(arr) + +func clear() -> void: + for lap in checkpoints: + lap.fill(-1) + snaps.clear() + time = 0 + snap_count = 0 + +func collect(lap: int, cp: int, now: float) -> void: + now = snappedf(now, .001) # 3dec precision + if lap == len(checkpoints) - 1 && cp == -1: + checkpoints[lap][cp] = now + time = now + else: + checkpoints[lap][cp] = now + +func has_collected(lap: int, cp: int) -> bool: + return checkpoints[lap][cp] != -1 + +func get_time(lap: int, cp: int) -> float: + return checkpoints[lap][cp] + +static func from_d(d: Dictionary) -> GhostData: + var obj := GhostData.new() + obj.time = d.time + obj.checkpoints = d.checkpoints + obj.snap_count = d.snap_count + obj.snaps = d.snaps + 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 {} + +## Creates a [GhostData] from a file +static func _load(path: String) -> GhostData: + var res := _load_file(path) + if res.is_empty(): + return null + return GhostData.from_d(res) |