bricasse/tools/highscores.gd

59 lines
1.9 KiB
GDScript

extends Reference
# Score list. A map level_name -> value
var scores = {}
# Path to score file
const score_file = "user://highscores.json"
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Return the score or null if unset
func get_score(level_name: String):
return scores.get(level_name, null)
# Set score, return true if a new high score was set, false otherwise
func set_score(level_name: String, new_score: int):
var old_score = get_score(level_name)
if (old_score == null) or (new_score > old_score):
scores[level_name] = new_score
save_scores()
return true
else:
return false
func save_scores():
# Serialize the scores in JSON
var serialized = JSON.print(scores)
# Write them to score file
var file = File.new()
var err = file.open(score_file, File.WRITE)
if err == OK:
file.store_string(serialized)
file.close()
else:
print("Error opening file " + score_file + " - Unable to save scores")
func load_scores():
# Clear scores
scores.clear()
# Read score file, if it exists
var file = File.new()
if file.file_exists(score_file):
var err = file.open(score_file, File.READ)
if err == OK:
var serialized = file.get_as_text()
file.close()
# Parse JSON
var parsed = JSON.parse(serialized)
# Check if OK
if (parsed.error == OK) && (typeof(parsed.result) == TYPE_DICTIONARY):
# Numeric values read from JSON are float type : must be converted to int
for k in parsed.result.keys():
scores[k] = int(parsed.result[k])
else:
print("Error reading file " + score_file + " - Unexpected format")
else:
print("Error opening existing file " + score_file)