Skip to content

Commit 532761b

Browse files
simone-lungarellaLincoln-Ab
authored andcommitted
fix: updated level page to always show import buttons
1 parent 3fca748 commit 532761b

File tree

11 files changed

+157
-15
lines changed

11 files changed

+157
-15
lines changed

ROADMAP.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ Secondary mechanics are:
7272

7373

7474
- [ ] Add hint when copied level code;
75-
- [ ] Disable save button when name or code is missing in import window;
76-
- [ ] Update level interface when importing a level;
75+
- [x] Disable save button when name or code is missing in import window;
76+
- [x] Update level interface when importing a level;
7777
- [x] Duplicate inspection panel for normal/custom levels;
78+
- [x] When custom levels page are full, add a placeholder plage;
7879

assets/resources/levels/persistent_levels.tres

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[gd_resource type="Resource" script_class="LevelContainer" load_steps=33 format=3 uid="uid://cjy7x1yxt7fai"]
1+
[gd_resource type="Resource" script_class="LevelContainer" load_steps=39 format=3]
22

33
[ext_resource type="Script" path="res://scripts/utility/cell_data.gd" id="1_6i8uv"]
44
[ext_resource type="Script" path="res://scripts/utility/level_data.gd" id="2_0gd78"]
@@ -192,11 +192,52 @@ Vector2i(0, 1): SubResource("Resource_08a6n")
192192
}
193193
moves_left = 1
194194

195+
[sub_resource type="Resource" id="Resource_d2d8n"]
196+
script = ExtResource("1_6i8uv")
197+
is_blocked = false
198+
value = 0
199+
200+
[sub_resource type="Resource" id="Resource_iqndp"]
201+
script = ExtResource("1_6i8uv")
202+
is_blocked = false
203+
value = 0
204+
205+
[sub_resource type="Resource" id="Resource_0bs3p"]
206+
script = ExtResource("1_6i8uv")
207+
is_blocked = false
208+
value = -1
209+
210+
[sub_resource type="Resource" id="Resource_kwqon"]
211+
script = ExtResource("1_6i8uv")
212+
is_blocked = false
213+
value = -1
214+
215+
[sub_resource type="Resource" id="Resource_ud33m"]
216+
script = ExtResource("3_xl0g1")
217+
area_effect = 0
218+
area_behavior = 0
219+
220+
[sub_resource type="Resource" id="Resource_dt2ar"]
221+
script = ExtResource("2_0gd78")
222+
width = 3
223+
height = 3
224+
cells_list = {
225+
Vector2i(0, 0): SubResource("Resource_d2d8n"),
226+
Vector2i(0, 1): SubResource("Resource_iqndp"),
227+
Vector2i(1, 0): SubResource("Resource_0bs3p"),
228+
Vector2i(1, 1): SubResource("Resource_kwqon")
229+
}
230+
slider_list = {
231+
Vector2i(0, 1): SubResource("Resource_ud33m")
232+
}
233+
moves_left = 1
234+
195235
[resource]
196236
script = ExtResource("4_v7vmu")
197237
levels = {
198238
"01": SubResource("Resource_8kl84"),
199239
"04": SubResource("Resource_duaxn"),
200-
"1": SubResource("Resource_iwiep")
240+
"1": SubResource("Resource_iwiep"),
241+
"test1": SubResource("Resource_dt2ar")
201242
}
202-
levels_order = Array[String](["1", "01", "04"])
243+
levels_order = Array[String](["1", "01", "04", "test1"])
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[gd_resource type="StyleBoxFlat" format=3 uid="uid://cd3jmdgaeav3d"]
2+
3+
[resource]
4+
bg_color = Color(0.6, 0.6, 0.6, 0)
5+
border_width_left = 5
6+
border_width_top = 5
7+
border_width_right = 5
8+
border_width_bottom = 5
9+
border_color = Color(0.972549, 0.196078, 0.196078, 1)
10+
corner_radius_top_left = 20
11+
corner_radius_top_right = 20
12+
corner_radius_bottom_right = 20
13+
corner_radius_bottom_left = 20

assets/resources/themes/text_area.tres

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
[resource]
44
bg_color = Color(1, 0.972549, 0.937255, 1)
5-
border_width_left = 10
6-
border_width_top = 10
7-
border_width_right = 10
8-
border_width_bottom = 10
5+
border_width_left = 5
6+
border_width_top = 5
7+
border_width_right = 5
8+
border_width_bottom = 5
99
border_color = Color(0.25098, 0.184314, 0.105882, 1)
1010
corner_radius_top_left = 20
1111
corner_radius_top_right = 20

packed_scene/user_interface/LevelImport.tscn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ layout_mode = 2
106106
size_flags_horizontal = 5
107107
focus_mode = 0
108108
theme = ExtResource("3_18iy2")
109+
disabled = true
109110
icon = SubResource("CompressedTexture2D_ud3al")
110111

111112
[connection signal="gui_input" from="Background" to="." method="_on_background_gui_input"]

scripts/user_interface/level_import.gd

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
extends Control
22

3+
const BUTTON_ERROR = preload("res://assets/resources/themes/button_error.tres")
34
var _inserted_code: String
45

56
@onready var code: Button = %Code
67
@onready var level_name: LineEdit = %LevelName
8+
@onready var save_btn: Button = %SaveBtn
9+
10+
11+
func _ready() -> void:
12+
GameManager.on_state_change.connect(_on_state_change)
713

814

915
func _on_background_gui_input(event: InputEvent) -> void:
@@ -12,17 +18,23 @@ func _on_background_gui_input(event: InputEvent) -> void:
1218

1319

1420
func _on_save_btn_pressed() -> void:
15-
var level_data := Encoder.decode(_inserted_code)
21+
var level_data: LevelData = Encoder.decode(_inserted_code)
1622
if level_data == null:
17-
pass
18-
GameManager.save_custom_level(level_name.text, level_data)
23+
_show_error()
24+
else:
25+
GameManager.save_custom_level(level_name.text, level_data)
26+
GameManager.level_ui.add_imported_level(level_name.text)
27+
code.text = ""
28+
level_name.text = ""
29+
self.hide()
1930

2031

2132
func _on_code_pressed() -> void:
2233
var cb_content := DisplayServer.clipboard_get()
2334
_inserted_code = cb_content.split("\n")[0]
2435

2536
code.text = " " + _inserted_code
37+
_update_save_btn()
2638

2739

2840
func _on_level_name_text_changed(new_text: String) -> void:
@@ -35,3 +47,39 @@ func _on_level_name_text_changed(new_text: String) -> void:
3547
level_name.caret_column = level_name.text.length()
3648
else:
3749
level_name.text = ""
50+
51+
_update_save_btn()
52+
53+
54+
func _update_save_btn() -> void:
55+
if code.text == "" or level_name.text == "":
56+
save_btn.disabled = true
57+
else:
58+
save_btn.disabled = false
59+
60+
61+
func _on_state_change(new_state: GlobalConst.GameState) -> void:
62+
match new_state:
63+
GlobalConst.GameState.LEVEL_IMPORT:
64+
self.show()
65+
GlobalConst.GameState.MAIN_MENU:
66+
self.queue_free.call_deferred()
67+
GlobalConst.GameState.BUILDER_IDLE:
68+
self.queue_free.call_deferred()
69+
GlobalConst.GameState.LEVEL_START:
70+
self.queue_free.call_deferred()
71+
_:
72+
self.hide()
73+
74+
75+
func _show_error() -> void:
76+
save_btn.disabled = true
77+
code.add_theme_stylebox_override("normal", BUTTON_ERROR)
78+
code.add_theme_color_override("icon_normal_color", Color.DARK_RED)
79+
code.add_theme_color_override("font_color", Color.DARK_RED)
80+
81+
await get_tree().create_timer(1).timeout
82+
code.remove_theme_stylebox_override("normal")
83+
code.remove_theme_color_override("icon_normal_color")
84+
code.remove_theme_color_override("font_color")
85+
code.text = ""

scripts/user_interface/level_inspect.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ var _level_name: String
1414
@onready var unlock_btn: Button = %UnlockBtn
1515
@onready var build_btn: Button = %BuildBtn
1616
@onready var play_btn: Button = %PlayBtn
17-
@onready var copy_btn: Button = %CopyBtn
1817

1918

2019
func _ready() -> void:
@@ -96,5 +95,6 @@ func _update_buttons(is_unlocked: bool) -> void:
9695

9796

9897
func _on_unlock_btn_pressed() -> void:
98+
GameManager.unlock_level(GlobalConst.LevelGroup.MAIN, _level_name)
9999
_update_buttons(true)
100100
level_unlocked.emit()

scripts/user_interface/level_ui.gd

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,26 @@ func _ready() -> void:
1818
_update_content()
1919

2020

21+
func add_imported_level(level_name: String) -> void:
22+
_placeholder_buttons[-1].queue_free()
23+
_placeholder_buttons.remove_at(_placeholder_buttons.size() - 1)
24+
25+
var level_button := LevelButton.new()
26+
level_button.on_delete_level_button.connect(_update_last_level)
27+
_level_buttons.append(level_button)
28+
level_grid.add_child(level_button)
29+
30+
var progress = LevelProgress.new()
31+
progress.move_left = -1000
32+
progress.is_unlocked = true
33+
progress.is_completed = true
34+
35+
level_button.construct(level_name, progress, GlobalConst.LevelGroup.CUSTOM)
36+
level_grid.move_child(level_button, _level_buttons.size() - 1)
37+
# Show next page button if there are no placeholder buttons
38+
_update_buttons(_placeholder_buttons.size() == 0)
39+
40+
2141
func _on_state_change(new_state: GlobalConst.GameState) -> void:
2242
match new_state:
2343
GlobalConst.GameState.MAIN_MENU:
@@ -46,7 +66,11 @@ func _update_content() -> void:
4666
var levels_progress: Dictionary
4767
# get extra level for test next page
4868
levels_progress = GameManager.get_page_levels(_world, first_level, last_level + 1)
49-
_update_buttons(levels_progress.size() > PAGE_SIZE)
69+
match _world:
70+
GlobalConst.LevelGroup.MAIN:
71+
_update_buttons(levels_progress.size() > PAGE_SIZE)
72+
GlobalConst.LevelGroup.CUSTOM:
73+
_update_buttons(levels_progress.size() > PAGE_SIZE - 1)
5074

5175
var max_level_btn := mini(levels_progress.size(), PAGE_SIZE)
5276
# remove excess level button
@@ -101,7 +125,12 @@ func _update_last_level(ref: LevelButton) -> void:
101125
var levels_progress: Dictionary
102126
# get extra level for test next page
103127
levels_progress = GameManager.get_page_levels(_world, last_level, last_level + 1)
104-
_update_buttons(levels_progress.size() > 1)
128+
129+
match _world:
130+
GlobalConst.LevelGroup.MAIN:
131+
_update_buttons(levels_progress.size() > 1)
132+
GlobalConst.LevelGroup.CUSTOM:
133+
_update_buttons(levels_progress.size() > 0)
105134

106135
if levels_progress.size() > 0:
107136
# add level button
@@ -154,3 +183,7 @@ func _on_custom_btn_pressed() -> void:
154183
_world = GlobalConst.LevelGroup.CUSTOM
155184
_current_page = 1
156185
_update_content()
186+
187+
188+
func _add_empty_page() -> void:
189+
pass

scripts/user_interface/main_menu.gd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ func _on_level_btn_pressed():
5353
level_ui = LEVEL_UI.instantiate()
5454
get_tree().root.add_child.call_deferred(level_ui)
5555

56+
GameManager.level_ui = level_ui
5657
GameManager.change_state.call_deferred(GlobalConst.GameState.LEVEL_PICK)
5758

5859

scripts/utility/const.gd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ enum GameState {
1313
BUILDER_TEST,
1414
BUILDER_RESIZE,
1515
LEVEL_INSPECT,
16+
LEVEL_IMPORT,
1617
CUSTOM_LEVEL_INSPECT
1718
}
1819
enum LevelGroup { CUSTOM, MAIN }

0 commit comments

Comments
 (0)