Skip to content

Commit ace4ce3

Browse files
committed
feat: fill in placeholder preview displays
Added bogo sort to the main menu and level previews to level selection.
1 parent c247f67 commit ace4ce3

File tree

11 files changed

+153
-89
lines changed

11 files changed

+153
-89
lines changed

levels/bogo_sort.gd

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
extends ComparisonSort
2+
class_name BogoSort
3+
4+
func _init(array).(array):
5+
pass
6+
7+
func check(action):
8+
return true
9+
10+
func next():
11+
array = ArrayModel.new(array.size)
12+
13+
func emphasized(i):
14+
return false

models/array_model.gd

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ var array = []
99
var size
1010

1111
func _init(size):
12-
for i in range(1, size + 1):
13-
array.append(i)
14-
array.shuffle()
15-
self.size = size
12+
for i in range(1, size + 1):
13+
array.append(i)
14+
array.shuffle()
15+
self.size = size
1616

1717
func get(i):
18-
return array[i]
18+
return array[i]
1919

2020
func is_sorted():
21-
for i in range(size - 1):
22-
if array[i] > array[i + 1]:
23-
return false
24-
return true
21+
for i in range(size - 1):
22+
if array[i] > array[i + 1]:
23+
return false
24+
return true
2525

2626
func swap(i, j):
27-
var temp = array[i]
28-
array[i] = array[j]
29-
array[j] = temp
27+
var temp = array[i]
28+
array[i] = array[j]
29+
array[j] = temp

project.godot

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ _global_script_classes=[ {
2020
"path": "res://views/array_view.gd"
2121
}, {
2222
"base": "ComparisonSort",
23+
"class": "BogoSort",
24+
"language": "GDScript",
25+
"path": "res://levels/bogo_sort.gd"
26+
}, {
27+
"base": "ComparisonSort",
2328
"class": "BubbleSort",
2429
"language": "GDScript",
2530
"path": "res://levels/bubble_sort.gd"
@@ -32,6 +37,7 @@ _global_script_classes=[ {
3237
_global_script_class_icons={
3338
"ArrayModel": "",
3439
"ArrayView": "",
40+
"BogoSort": "",
3541
"BubbleSort": "",
3642
"ComparisonSort": ""
3743
}

scenes/levels.tscn

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,28 +35,39 @@ margin_top = 20.0
3535
margin_right = 460.0
3636
margin_bottom = 1000.0
3737

38-
[node name="PreviewBorder" type="MarginContainer" parent="LevelSelect"]
38+
[node name="Preview" type="VBoxContainer" parent="LevelSelect"]
3939
margin_left = 488.0
4040
margin_right = 1860.0
4141
margin_bottom = 1020.0
4242
size_flags_horizontal = 3
43+
44+
[node name="Display" type="MarginContainer" parent="LevelSelect/Preview"]
45+
margin_right = 1372.0
46+
margin_bottom = 640.0
47+
rect_min_size = Vector2( 0, 640 )
4348
script = ExtResource( 3 )
4449

45-
[node name="Preview" type="VBoxContainer" parent="LevelSelect/PreviewBorder"]
50+
[node name="Placeholder" type="Control" parent="LevelSelect/Preview/Display"]
4651
margin_left = 20.0
4752
margin_top = 20.0
4853
margin_right = 1352.0
49-
margin_bottom = 1000.0
50-
size_flags_horizontal = 3
51-
52-
[node name="Display" type="Control" parent="LevelSelect/PreviewBorder/Preview"]
53-
margin_right = 1332.0
54-
margin_bottom = 640.0
55-
rect_min_size = Vector2( 0, 640 )
54+
margin_bottom = 620.0
5655

57-
[node name="Info" type="Label" parent="LevelSelect/PreviewBorder/Preview"]
56+
[node name="InfoBorder" type="MarginContainer" parent="LevelSelect/Preview"]
5857
margin_top = 648.0
59-
margin_right = 1332.0
60-
margin_bottom = 686.0
61-
size_flags_horizontal = 3
58+
margin_right = 1372.0
59+
margin_bottom = 1020.0
60+
size_flags_vertical = 3
61+
script = ExtResource( 3 )
62+
63+
[node name="Info" type="Label" parent="LevelSelect/Preview/InfoBorder"]
64+
margin_left = 20.0
65+
margin_top = 20.0
66+
margin_right = 1352.0
67+
margin_bottom = 352.0
68+
size_flags_vertical = 1
6269
autowrap = true
70+
71+
[node name="Timer" type="Timer" parent="."]
72+
autostart = true
73+
[connection signal="timeout" from="Timer" to="LevelSelect" method="_on_Timer_timeout"]

scenes/menu.tscn

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
[ext_resource path="res://scripts/menu.gd" type="Script" id=1]
44
[ext_resource path="res://assets/theme.theme" type="Theme" id=2]
5-
6-
[sub_resource type="StyleBoxEmpty" id=1]
5+
[ext_resource path="res://scripts/border.gd" type="Script" id=3]
76

87
[node name="Viewport" type="MarginContainer"]
98
anchor_left = 0.000711028
@@ -32,19 +31,32 @@ margin_bottom = 38.0
3231
text = "Human Computer Simulator"
3332
uppercase = true
3433

35-
[node name="Display" type="Control" parent="MainMenu"]
34+
[node name="Display" type="MarginContainer" parent="MainMenu"]
3635
margin_top = 46.0
3736
margin_right = 1839.0
38-
margin_bottom = 973.0
37+
margin_bottom = 965.0
3938
size_flags_vertical = 3
39+
script = ExtResource( 3 )
40+
__meta__ = {
41+
"_edit_use_anchors_": false
42+
}
43+
44+
[node name="Spacing" type="Control" parent="MainMenu"]
45+
margin_top = 973.0
46+
margin_right = 1839.0
47+
margin_bottom = 973.0
4048

4149
[node name="StartButton" type="Button" parent="MainMenu"]
4250
margin_left = 872.0
4351
margin_top = 981.0
4452
margin_right = 967.0
4553
margin_bottom = 1019.0
4654
size_flags_horizontal = 4
47-
custom_styles/focus = SubResource( 1 )
4855
text = "start"
4956
flat = true
57+
58+
[node name="Timer" type="Timer" parent="."]
59+
wait_time = 0.25
60+
autostart = true
5061
[connection signal="pressed" from="MainMenu/StartButton" to="MainMenu" method="_on_StartButton_pressed"]
62+
[connection signal="timeout" from="Timer" to="MainMenu" method="_on_Timer_timeout"]

scripts/end.gd

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
extends VBoxContainer
22

33
func _ready():
4-
$Score.text = str(scene.get_param("score"))
5-
$Button.grab_focus()
4+
$Score.text = str(scene.get_param("score"))
5+
$Button.grab_focus()
66

77
func _on_Button_pressed():
8-
scene.change_scene("res://scenes/levels.tscn")
8+
scene.change_scene("res://scenes/levels.tscn")

scripts/levels.gd

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,44 @@
11
extends HBoxContainer
22

3-
var levels
3+
var levels: Dictionary
4+
var level
45

56
func _ready():
6-
var descriptions = File.new()
7-
descriptions.open("res://assets/levels.json", descriptions.READ)
8-
levels = parse_json(descriptions.get_as_text())
9-
var first = true
10-
for level in levels:
11-
var button = Button.new()
12-
button.text = level
13-
button.align = Button.ALIGN_LEFT
14-
button.connect("focus_entered", self, "_on_Button_focus_changed")
15-
button.connect("pressed", self, "_on_Button_pressed", [level])
16-
$LevelsBorder/Levels.add_child(button)
17-
if first:
18-
button.grab_focus()
19-
first = false
7+
# Load level data
8+
var descriptions = File.new()
9+
descriptions.open("res://assets/levels.json", descriptions.READ)
10+
levels = parse_json(descriptions.get_as_text())
11+
# Dynamically add buttons
12+
for level in levels:
13+
var button = Button.new()
14+
button.text = level
15+
button.align = Button.ALIGN_LEFT
16+
button.connect("focus_entered", self, "_on_Button_focus_changed")
17+
button.connect("pressed", self, "_on_Button_pressed", [level])
18+
$LevelsBorder/Levels.add_child(button)
19+
# Automatically focus on first button
20+
$LevelsBorder/Levels.get_child(0).grab_focus()
2021

2122
func _on_Button_focus_changed():
22-
$PreviewBorder/Preview/Info.text = levels[get_focus_owner().text]["about"]
23+
var name = get_focus_owner().text
24+
$Preview/InfoBorder/Info.text = levels[name]["about"]
25+
level = get_level(name).new(ArrayModel.new(10))
26+
level.active = false
27+
# Start over when simulation is finished
28+
level.connect("done", self, "_on_Button_focus_changed")
29+
# Replace old display with new
30+
for child in $Preview/Display.get_children():
31+
child.queue_free()
32+
$Preview/Display.add_child(ArrayView.new(level))
2333

2434
func _on_Button_pressed(level):
25-
scene.change_scene("res://scenes/play.tscn", {"level": level})
35+
scene.change_scene("res://scenes/play.tscn",
36+
{"name": level, "level": get_level(level)})
37+
38+
func get_level(level):
39+
match level:
40+
"BUBBLE SORT":
41+
return BubbleSort
42+
43+
func _on_Timer_timeout():
44+
level.next()

scripts/menu.gd

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
extends VBoxContainer
22

3+
var level = BogoSort.new(ArrayModel.new(10))
4+
35
func _ready():
4-
$StartButton.grab_focus()
6+
$StartButton.grab_focus()
7+
$Display.add_child(ArrayView.new(level))
58

69
func _on_StartButton_pressed():
7-
scene.change_scene("res://scenes/levels.tscn")
10+
scene.change_scene("res://scenes/levels.tscn")
11+
12+
func _on_Timer_timeout():
13+
level.next()

scripts/play.gd

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,24 @@ extends VBoxContainer
33
var start_time = -1
44

55
func _ready():
6-
$HUDBorder/HUD/Level.text = scene.get_param("level")
6+
$HUDBorder/HUD/Level.text = scene.get_param("name")
77

88
func _process(delta):
9-
if start_time >= 0:
10-
$HUDBorder/HUD/Score.text = "%.3f" % get_score()
9+
if start_time >= 0:
10+
$HUDBorder/HUD/Score.text = "%.3f" % get_score()
1111

1212
func _on_Timer_timeout():
13-
start_time = OS.get_ticks_msec()
14-
# Delete ready text
15-
$DisplayBorder/Label.queue_free()
16-
# Load level
17-
var array = ArrayModel.new(10)
18-
var level = getLevel(scene.get_param("level")).new(array)
19-
level.connect("done", self, "_on_Level_done")
20-
$DisplayBorder.add_child(ArrayView.new(level))
21-
22-
func getLevel(level):
23-
match level:
24-
"BUBBLE SORT":
25-
return BubbleSort
13+
start_time = OS.get_ticks_msec()
14+
# Delete ready text
15+
$DisplayBorder/Label.queue_free()
16+
# Load level
17+
var array = ArrayModel.new(10)
18+
var level = scene.get_param("level").new(array)
19+
level.connect("done", self, "_on_Level_done")
20+
$DisplayBorder.add_child(ArrayView.new(level))
2621

2722
func get_score():
28-
return stepify((OS.get_ticks_msec() - start_time) / 1000.0, 0.001)
23+
return stepify((OS.get_ticks_msec() - start_time) / 1000.0, 0.001)
2924

3025
func _on_Level_done():
31-
scene.change_scene("res://scenes/end.tscn", {"score": get_score()})
26+
scene.change_scene("res://scenes/end.tscn", {"score": get_score()})

scripts/scene.gd

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ extends Node
33
var _params = null
44

55
func change_scene(next_scene, params=null):
6-
_params = params
7-
get_tree().change_scene(next_scene)
6+
_params = params
7+
get_tree().change_scene(next_scene)
88

99
func get_param(name):
10-
if _params != null and _params.has(name):
11-
return _params[name]
12-
return null
10+
if _params != null and _params.has(name):
11+
return _params[name]
12+
return null

views/array_view.gd

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,22 @@ var level
88
var rects = []
99

1010
func _init(level):
11-
level.connect("mistake", self, "_on_Level_mistake")
12-
add_child(level)
13-
self.level = level
14-
for i in range(level.array.size):
15-
var rect = ColorRect.new()
16-
rect.size_flags_horizontal = Control.SIZE_EXPAND_FILL
17-
rect.size_flags_vertical = Control.SIZE_SHRINK_END
18-
rects.append(rect)
19-
add_child(rect)
11+
level.connect("mistake", self, "_on_Level_mistake")
12+
add_child(level)
13+
self.level = level
14+
for i in range(level.array.size):
15+
var rect = ColorRect.new()
16+
rect.size_flags_horizontal = Control.SIZE_EXPAND_FILL
17+
rect.size_flags_vertical = Control.SIZE_SHRINK_END
18+
rects.append(rect)
19+
add_child(rect)
2020

2121
func _process(delta):
22-
for i in range(level.array.size):
23-
rects[i].rect_scale.y = -1 # Override parent Control scale
24-
rects[i].color = ORANGE if level.emphasized(i) else GREEN
25-
rects[i].rect_size.y = rect_size.y * level.array.get(i) / level.array.size
22+
for i in range(level.array.size):
23+
rects[i].rect_scale.y = -1 # Override parent Control scale
24+
rects[i].color = ORANGE if level.emphasized(i) else GREEN
25+
var frac = float(level.array.get(i)) / level.array.size
26+
rects[i].rect_size.y = rect_size.y * frac
2627

2728
func _on_Level_mistake():
28-
get_parent().flash()
29+
get_parent().flash()

0 commit comments

Comments
 (0)