Skip to content

Commit e2b0052

Browse files
committed
feat: add tier system
For now it is based on the number of moves per second the player manages to achieve. This should make unlucky shuffles a non-issue.
1 parent 4c9c7fe commit e2b0052

File tree

8 files changed

+77
-26
lines changed

8 files changed

+77
-26
lines changed

levels/comparison_sort.gd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const DISABLE_TIME = 1.0
1515
var array: ArrayModel
1616
var active = true
1717
var done = false
18+
var moves = 0
1819

1920
var _timer = Timer.new()
2021

@@ -32,6 +33,7 @@ func _input(event):
3233
if done or not active:
3334
return
3435
if event.is_pressed():
36+
moves += 1
3537
return next(event.as_text())
3638

3739
func next(action):

project.godot

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ _global_script_classes=[ {
5454
"language": "GDScript",
5555
"path": "res://levels/quick_sort.gd"
5656
}, {
57+
"base": "Reference",
58+
"class": "Score",
59+
"language": "GDScript",
60+
"path": "res://scripts/score.gd"
61+
}, {
5762
"base": "ComparisonSort",
5863
"class": "SelectionSort",
5964
"language": "GDScript",
@@ -69,6 +74,7 @@ _global_script_class_icons={
6974
"InsertionSort": "",
7075
"MergeSort": "",
7176
"QuickSort": "",
77+
"Score": "",
7278
"SelectionSort": ""
7379
}
7480

@@ -137,22 +143,22 @@ ui_down={
137143
}
138144
faster={
139145
"deadzone": 0.5,
140-
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":46,"unicode":0,"echo":false,"script":null)
146+
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null)
141147
]
142148
}
143149
slower={
144150
"deadzone": 0.5,
145-
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":44,"unicode":0,"echo":false,"script":null)
151+
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null)
146152
]
147153
}
148154
bigger={
149155
"deadzone": 0.5,
150-
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":61,"unicode":0,"echo":false,"script":null)
156+
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null)
151157
]
152158
}
153159
smaller={
154160
"deadzone": 0.5,
155-
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":45,"unicode":0,"echo":false,"script":null)
161+
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null)
156162
]
157163
}
158164

scenes/levels.tscn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ margin_top = 577.0
5252
margin_right = 283.0
5353
margin_bottom = 640.0
5454
size_flags_vertical = 8
55-
text = "Use +/- and </> to adjust the size and speed of the simulation, respectively."
55+
text = "Use the WASD keys to adjust the size and speed of the simulation."
5656
autowrap = true
5757

5858
[node name="Preview" type="VBoxContainer" parent="LevelSelect"]

scenes/play.tscn

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@ size_flags_horizontal = 3
4848
text = "0.000"
4949
align = 2
5050

51-
[node name="DisplayBorder" type="MarginContainer" parent="GameDisplay"]
51+
[node name="Display" type="MarginContainer" parent="GameDisplay"]
5252
margin_top = 67.0
5353
margin_right = 1220.0
5454
margin_bottom = 660.0
5555
size_flags_vertical = 3
5656
script = ExtResource( 3 )
5757

58-
[node name="Label" type="Label" parent="GameDisplay/DisplayBorder"]
58+
[node name="Label" type="Label" parent="GameDisplay/Display"]
5959
margin_left = 20.0
6060
margin_top = 287.0
6161
margin_right = 1200.0

scripts/levels.gd

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,28 @@ const MAX_WAIT = 4
1212
const MIN_SIZE = 8
1313
const MAX_SIZE = 256
1414

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

1818
func _ready():
1919
var buttons = $LevelsBorder/Levels/LevelsContainer/Buttons
20+
var scores = $LevelsBorder/Levels/LevelsContainer/Scores
2021
for level in LEVELS:
2122
var button = Button.new()
2223
button.text = level.NAME
2324
button.align = Button.ALIGN_LEFT
2425
button.connect("focus_entered", self, "_on_Button_focus_entered")
2526
button.connect("pressed", self, "_on_Button_pressed", [level])
2627
buttons.add_child(button)
27-
var score = Label.new()
28-
score.align = Label.ALIGN_RIGHT
29-
$LevelsBorder/Levels/LevelsContainer/Scores.add_child(score)
28+
var score = HBoxContainer.new()
29+
var time = Label.new()
30+
time.align = Label.ALIGN_RIGHT
31+
time.size_flags_horizontal = Control.SIZE_EXPAND_FILL
32+
var tier = Label.new()
33+
# tier.align = Label.ALIGN_RIGHT
34+
score.add_child(time)
35+
score.add_child(tier)
36+
scores.add_child(score)
3037
# Autofocus last played level
3138
for button in buttons.get_children():
3239
if button.text == _level.NAME:
@@ -40,14 +47,22 @@ func _ready():
4047
func _on_Button_focus_entered(size=_level.array.size):
4148
# Update high scores
4249
var buttons = $LevelsBorder/Levels/LevelsContainer/Buttons
43-
var scores = $LevelsBorder/Levels/LevelsContainer/Scores
4450
var save = GlobalScene.read_save()
4551
for i in range(LEVELS.size()):
52+
var score = $LevelsBorder/Levels/LevelsContainer/Scores.get_child(i)
4653
var name = buttons.get_child(i).text
4754
if name in save and str(size) in save[name]:
48-
scores.get_child(i).text = "%.3f" % save[name][str(size)]
55+
var moves = save[name][str(size)][0]
56+
var time = save[name][str(size)][1]
57+
score.get_child(0).text = "%.3f" % time
58+
score.get_child(1).text = Score.get_tier(moves, time)
59+
score.get_child(1).add_color_override(
60+
"font_color", Score.get_color(moves, time))
4961
else:
50-
scores.get_child(i).text = "INF"
62+
score.get_child(0).text = ""
63+
score.get_child(1).text = "INF"
64+
score.get_child(1).add_color_override(
65+
"font_color", GlobalTheme.GREEN)
5166
# Pause a bit to show completely sorted array
5267
if _level.array.is_sorted():
5368
$Timer.stop()

scripts/play.gd

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ func _process(delta):
1313

1414
func _on_Timer_timeout():
1515
_start_time = OS.get_ticks_msec()
16-
$DisplayBorder/Label.queue_free() # Delete ready text
16+
$Display/Label.queue_free() # Delete ready text
1717
var level = _level.new(ArrayModel.new(
1818
GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE)))
19-
level.connect("done", self, "_on_Level_done")
20-
$DisplayBorder.add_child(ArrayView.new(level))
19+
level.connect("done", self, "_on_Level_done", [level])
20+
$Display.add_child(ArrayView.new(level))
2121

2222
func get_score():
2323
return stepify((OS.get_ticks_msec() - _start_time) / 1000.0, 0.001)
@@ -26,7 +26,9 @@ func _input(event):
2626
if event.is_action_pressed("ui_cancel"):
2727
_on_Button_pressed("levels")
2828

29-
func _on_Level_done():
29+
func _on_Level_done(level):
30+
var moves = level.moves
31+
var score = get_score()
3032
var restart = Button.new()
3133
restart.text = "RESTART LEVEL"
3234
restart.connect("pressed", self, "_on_Button_pressed", ["play"])
@@ -35,26 +37,31 @@ func _on_Level_done():
3537
var back = Button.new()
3638
back.text = "BACK TO LEVEL SELECT"
3739
back.connect("pressed", self, "_on_Button_pressed", ["levels"])
38-
var result = Label.new()
39-
result.text = "%.3f" % get_score()
40-
result.size_flags_horizontal = Control.SIZE_EXPAND_FILL
41-
result.align = Label.ALIGN_RIGHT
40+
var time = Label.new()
41+
time.text = "%.3f" % get_score()
42+
time.align = Label.ALIGN_RIGHT
43+
time.size_flags_horizontal = Control.SIZE_EXPAND_FILL
4244
_start_time = -1
45+
var tier = Label.new()
46+
tier.text = Score.get_tier(moves, score)
47+
tier.align = Label.ALIGN_RIGHT
48+
tier.add_color_override("font_color", Score.get_color(moves, score))
4349
$HUDBorder/HUD/Level.queue_free()
4450
$HUDBorder/HUD/Score.queue_free()
4551
$HUDBorder/HUD.add_child(restart)
4652
$HUDBorder/HUD.add_child(separator)
4753
$HUDBorder/HUD.add_child(back)
48-
$HUDBorder/HUD.add_child(result)
54+
$HUDBorder/HUD.add_child(time)
55+
$HUDBorder/HUD.add_child(tier)
4956
restart.grab_focus()
5057
var save = GlobalScene.read_save()
5158
var name = _level.NAME
5259
var size = str(GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE))
5360
if not name in save:
5461
save[name] = {}
5562
if not size in save[name]:
56-
save[name][size] = INF
57-
save[name][size] = min(float(result.text), save[name][size])
63+
save[name][size] = [-1, INF]
64+
save[name][size] = [moves, min(float(time.text), save[name][size][1])]
5865
GlobalScene.write_save(save)
5966

6067
func _on_Button_pressed(scene):

scripts/scene.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ func change_scene(next_scene, params=null):
1111
get_tree().change_scene(next_scene)
1212

1313
func get_param(name, default=null):
14-
if _params != null and _params.has(name):
14+
if _params != null and _params.get(name) != null:
1515
return _params[name]
1616
return default
1717

scripts/score.gd

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""
2+
Common helper library for scoring functions.
3+
"""
4+
class_name Score
5+
extends Reference
6+
7+
const TIERS = ["F", "D", "C", "B", "A", "S"]
8+
const COLORS = [
9+
Color("f44336"),
10+
Color("ff9800"),
11+
Color("ffeb3b"),
12+
Color("4caf50"),
13+
Color("03a9f4"),
14+
Color("e040fb"),
15+
]
16+
17+
static func get_tier(moves, seconds):
18+
return TIERS[min(moves / seconds, TIERS.size() - 1)]
19+
20+
static func get_color(moves, seconds):
21+
return COLORS[min(moves / seconds, COLORS.size() - 1)]

0 commit comments

Comments
 (0)