Skip to content

Commit 4c9c7fe

Browse files
committed
feat: add persistent high score
The save file is located in user://save.json.
1 parent 605c62a commit 4c9c7fe

File tree

4 files changed

+53
-9
lines changed

4 files changed

+53
-9
lines changed

scenes/levels.tscn

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ margin_top = 20.0
3535
margin_right = 283.0
3636
margin_bottom = 640.0
3737

38+
[node name="LevelsContainer" type="HBoxContainer" parent="LevelSelect/LevelsBorder/Levels"]
39+
margin_right = 263.0
40+
41+
[node name="Buttons" type="VBoxContainer" parent="LevelSelect/LevelsBorder/Levels/LevelsContainer"]
42+
margin_right = 255.0
43+
size_flags_horizontal = 3
44+
45+
[node name="Scores" type="VBoxContainer" parent="LevelSelect/LevelsBorder/Levels/LevelsContainer"]
46+
margin_left = 263.0
47+
margin_right = 263.0
48+
3849
[node name="Label" type="Label" parent="LevelSelect/LevelsBorder"]
3950
margin_left = 20.0
4051
margin_top = 577.0

scripts/levels.gd

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,44 @@ const LEVELS = [
1010
const MIN_WAIT = 1.0 / 32 # Should be greater than maximum frame time
1111
const MAX_WAIT = 4
1212
const MIN_SIZE = 8
13-
const MAX_SIZE = 128
13+
const MAX_SIZE = 256
1414

1515
var _level = LEVELS[0].new(ArrayModel.new(
1616
GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE)))
1717

1818
func _ready():
19+
var buttons = $LevelsBorder/Levels/LevelsContainer/Buttons
1920
for level in LEVELS:
2021
var button = Button.new()
2122
button.text = level.NAME
2223
button.align = Button.ALIGN_LEFT
2324
button.connect("focus_entered", self, "_on_Button_focus_entered")
2425
button.connect("pressed", self, "_on_Button_pressed", [level])
25-
$LevelsBorder/Levels.add_child(button)
26-
# Autofocus last played level
27-
if GlobalScene.get_param("level") == level:
26+
buttons.add_child(button)
27+
var score = Label.new()
28+
score.align = Label.ALIGN_RIGHT
29+
$LevelsBorder/Levels/LevelsContainer/Scores.add_child(score)
30+
# Autofocus last played level
31+
for button in buttons.get_children():
32+
if button.text == _level.NAME:
2833
button.grab_focus()
29-
var top_button = $LevelsBorder/Levels.get_children()[0]
30-
var bottom_button = $LevelsBorder/Levels.get_children()[-1]
34+
var top_button = buttons.get_children()[0]
35+
var bottom_button = buttons.get_children()[-1]
3136
# Allow looping from ends of list
3237
top_button.focus_neighbour_top = bottom_button.get_path()
3338
bottom_button.focus_neighbour_bottom = top_button.get_path()
34-
# If no last played level, autofocus first level
35-
if GlobalScene.get_param("level") == null:
36-
top_button.grab_focus()
3739

3840
func _on_Button_focus_entered(size=_level.array.size):
41+
# Update high scores
42+
var buttons = $LevelsBorder/Levels/LevelsContainer/Buttons
43+
var scores = $LevelsBorder/Levels/LevelsContainer/Scores
44+
var save = GlobalScene.read_save()
45+
for i in range(LEVELS.size()):
46+
var name = buttons.get_child(i).text
47+
if name in save and str(size) in save[name]:
48+
scores.get_child(i).text = "%.3f" % save[name][str(size)]
49+
else:
50+
scores.get_child(i).text = "INF"
3951
# Pause a bit to show completely sorted array
4052
if _level.array.is_sorted():
4153
$Timer.stop()

scripts/play.gd

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ func _on_Level_done():
4747
$HUDBorder/HUD.add_child(back)
4848
$HUDBorder/HUD.add_child(result)
4949
restart.grab_focus()
50+
var save = GlobalScene.read_save()
51+
var name = _level.NAME
52+
var size = str(GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE))
53+
if not name in save:
54+
save[name] = {}
55+
if not size in save[name]:
56+
save[name][size] = INF
57+
save[name][size] = min(float(result.text), save[name][size])
58+
GlobalScene.write_save(save)
5059

5160
func _on_Button_pressed(scene):
5261
GlobalScene.change_scene("res://scenes/" + scene + ".tscn",

scripts/scene.gd

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,15 @@ func get_param(name, default=null):
1414
if _params != null and _params.has(name):
1515
return _params[name]
1616
return default
17+
18+
func read_save():
19+
var file = File.new()
20+
file.open("user://save.json", File.READ)
21+
return {} if not file.is_open() else parse_json(file.get_as_text())
22+
file.close()
23+
24+
func write_save(save):
25+
var file = File.new()
26+
file.open("user://save.json", File.WRITE)
27+
file.store_line(to_json(save))
28+
file.close()

0 commit comments

Comments
 (0)