forked from GDQuest/learn-gdscript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProfile.gd
205 lines (144 loc) · 6.65 KB
/
Profile.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
class_name Profile
extends Resource
signal progress_changed(exercise_name, progress)
signal scroll_sensitivity_changed(new_value)
signal framerate_limit_changed(new_value)
const VALID_FRAMERATE_LIMITS := [0, 30, 60]
# General profile details
export var player_name := ""
# Study progression (across multiple courses)
export var study_progression := []
export var last_started_lesson := {}
export var last_visible_lesson_block := {}
# User settings
export var language := "en"
# Relative size adjustment of all fonts, in integer numbers.
export var font_size_scale := 0
# Sensitivity when scrolling with the mouse wheel or touchpad.
export var scroll_sensitivity := 1.0 setget set_scroll_sensitivity
# Target framerate for the application, to reduce update intensity on lower end devices.
export var framerate_limit := 60 setget set_framerate_limit
func _init() -> void:
study_progression = []
last_started_lesson = {}
func save() -> void:
if resource_path.empty():
push_error("Cannot save a file without a filename, set resource_path first.")
return
ResourceSaver.save(resource_path, self)
take_over_path(resource_path)
func get_or_create_course(course_id: String) -> CourseProgress:
for course_progress in study_progression:
if course_progress.course_id == course_id:
return course_progress
var course_progress := CourseProgress.new()
course_progress.course_id = course_id
study_progression.append(course_progress)
# Save when it's a new item.
save()
return course_progress
func get_or_create_lesson(course_id: String, lesson_id: String) -> LessonProgress:
var course_progress := get_or_create_course(course_id)
for lesson_progress in course_progress.lessons:
if lesson_progress.lesson_id == lesson_id:
return lesson_progress
var lesson_progress := LessonProgress.new()
lesson_progress.lesson_id = lesson_id
course_progress.lessons.append(lesson_progress)
# Save when it's a new item.
save()
return lesson_progress
func set_lesson_reading_block(course_id: String, lesson_id: String, block_id: String) -> void:
var lesson_progress := get_or_create_lesson(course_id, lesson_id)
# Mark the block as read, if it wasn't marked before.
if not lesson_progress.completed_blocks.has(block_id):
lesson_progress.completed_blocks.append(block_id)
# Set it as the last visible block to use it later to restore position on the page.
if not last_visible_lesson_block.has(course_id):
last_visible_lesson_block[course_id] = {}
last_visible_lesson_block[course_id][lesson_id] = block_id
save()
func has_lesson_blocks_read(course_id: String, lesson_id: String) -> bool:
var lesson_progress := get_or_create_lesson(course_id, lesson_id)
return lesson_progress.completed_blocks.size() > 0
func is_lesson_block_read(course_id: String, lesson_id: String, block_id: String) -> bool:
var lesson_progress := get_or_create_lesson(course_id, lesson_id)
return lesson_progress.completed_blocks.has(block_id)
func get_last_visited_lesson_block(course_id: String, lesson_id: String) -> String:
# Ensure we have some data for the course and the lesson, if we didn't have it before.
var _course_progress := get_or_create_course(course_id)
var _lesson_progress := get_or_create_lesson(course_id, lesson_id)
if not last_visible_lesson_block.has(course_id):
return ""
if not last_visible_lesson_block[course_id].has(lesson_id):
return ""
return last_visible_lesson_block[course_id][lesson_id]
func set_lesson_reading_completed(course_id: String, lesson_id: String, completed: bool) -> void:
var lesson_progress := get_or_create_lesson(course_id, lesson_id)
lesson_progress.completed_reading = completed
save()
func is_lesson_reading_completed(course_id: String, lesson_id: String) -> bool:
var lesson_progress := get_or_create_lesson(course_id, lesson_id)
return lesson_progress.completed_reading
func set_lesson_quiz_completed(
course_id: String, lesson_id: String, quiz_id: String, completed: bool
) -> void:
var lesson_progress := get_or_create_lesson(course_id, lesson_id)
var quiz_listed := lesson_progress.completed_quizzes.has(quiz_id)
if completed and not quiz_listed:
lesson_progress.completed_quizzes.append(quiz_id)
elif not completed and quiz_listed:
lesson_progress.completed_quizzes.erase(quiz_id)
save()
func is_lesson_quiz_completed(course_id: String, lesson_id: String, quiz_id: String) -> bool:
var lesson_progress := get_or_create_lesson(course_id, lesson_id)
return lesson_progress.completed_quizzes.has(quiz_id)
func set_lesson_practice_completed(
course_id: String, lesson_id: String, practice_id: String, completed: bool
) -> void:
var lesson_progress := get_or_create_lesson(course_id, lesson_id)
var practice_listed := lesson_progress.completed_practices.has(practice_id)
if completed and not practice_listed:
lesson_progress.completed_practices.append(practice_id)
elif not completed and practice_listed:
lesson_progress.completed_practices.erase(practice_id)
save()
func is_lesson_practice_completed(course_id: String, lesson_id: String, practice_id: String) -> bool:
var lesson_progress := get_or_create_lesson(course_id, lesson_id)
return lesson_progress.completed_practices.has(practice_id)
func set_last_started_lesson(course_id: String, lesson_id: String) -> void:
# Ensure we have some data for the course and the lesson, if we didn't have it before.
var _course_progress := get_or_create_course(course_id)
var _lesson_progress := get_or_create_lesson(course_id, lesson_id)
# Store the last started lesson.
last_started_lesson[course_id] = lesson_id
save()
func get_last_started_lesson(course_id: String) -> String:
# Ensure we have some data for the course, if we didn't have it before.
var _course_progress := get_or_create_course(course_id)
var lesson_id := ""
if last_started_lesson.has(course_id):
lesson_id = last_started_lesson[course_id]
if lesson_id.empty():
return ""
# Ensure we have some data for the lesson, if we didn't have it before.
var _lesson_progress := get_or_create_lesson(course_id, lesson_id)
return lesson_id
func reset_course_progress(course_id: String) -> void:
var course_progress := get_or_create_course(course_id)
course_progress.reset()
if last_visible_lesson_block.has(course_id):
last_visible_lesson_block.erase(course_id)
if last_started_lesson.has(course_id):
last_started_lesson.erase(course_id)
save()
func set_scroll_sensitivity(amount: float) -> void:
scroll_sensitivity = max(amount, 0.1)
emit_signal("scroll_sensitivity_changed", scroll_sensitivity)
func set_framerate_limit(limit: int) -> void:
assert(
limit in VALID_FRAMERATE_LIMITS,
"The framerate limit must be one of: " + str(VALID_FRAMERATE_LIMITS)
)
framerate_limit = limit
emit_signal("framerate_limit_changed", framerate_limit)