debug lessons numbers different from 3
This commit is contained in:
@@ -55,6 +55,25 @@ static func _make_zero_durations(minigame_count: int) -> PackedInt32Array:
|
|||||||
return durations
|
return durations
|
||||||
|
|
||||||
|
|
||||||
|
# Resizes a games status array to target_size, keeping the existing statuses for
|
||||||
|
# the slots that remain (trim surplus / pad new slots with LOCKED). Used when a
|
||||||
|
# lesson's minigame count changes so old saves don't lose progress on resize.
|
||||||
|
static func _resize_games_array(games: Array, target_size: int) -> Array:
|
||||||
|
var resized: Array = []
|
||||||
|
for index: int in range(target_size):
|
||||||
|
resized.append(games[index] if index < games.size() else Status.LOCKED)
|
||||||
|
return resized
|
||||||
|
|
||||||
|
|
||||||
|
# Same idea for the duration metrics: keep recorded times for remaining slots.
|
||||||
|
static func _resize_durations(durations: PackedInt32Array, target_size: int) -> PackedInt32Array:
|
||||||
|
var resized: PackedInt32Array = PackedInt32Array()
|
||||||
|
resized.resize(target_size)
|
||||||
|
for index: int in range(mini(target_size, durations.size())):
|
||||||
|
resized[index] = durations[index]
|
||||||
|
return resized
|
||||||
|
|
||||||
|
|
||||||
# Make sure the unlocks are correct
|
# Make sure the unlocks are correct
|
||||||
func init_unlocks() -> void:
|
func init_unlocks() -> void:
|
||||||
if not unlocks:
|
if not unlocks:
|
||||||
@@ -111,17 +130,24 @@ func ensure_data_integrity(data: Dictionary[int, Dictionary]) -> Dictionary:
|
|||||||
if not garden.has("total_duration"):
|
if not garden.has("total_duration"):
|
||||||
garden["total_duration"] = _make_zero_durations(minigame_count)
|
garden["total_duration"] = _make_zero_durations(minigame_count)
|
||||||
|
|
||||||
# Check array "games"
|
# Check array "games": a corrupt (non-array) value is reset, but a size
|
||||||
if typeof(garden["games"]) != TYPE_ARRAY or (garden["games"] as Array).size() != minigame_count:
|
# mismatch (the lesson's minigame count changed) is resized in place so we
|
||||||
|
# keep existing progress for the slots that remain instead of wiping it.
|
||||||
|
if typeof(garden["games"]) != TYPE_ARRAY:
|
||||||
if not is_init:
|
if not is_init:
|
||||||
Log.warn("StudentProgression: Garden %d: invalid format for 'games' → reset." % index)
|
Log.warn("StudentProgression: Garden %d: invalid format for 'games' → reset." % index)
|
||||||
garden["games"] = _make_locked_games_array(minigame_count)
|
garden["games"] = _make_locked_games_array(minigame_count)
|
||||||
|
elif (garden["games"] as Array).size() != minigame_count:
|
||||||
|
if not is_init:
|
||||||
|
Log.warn("StudentProgression: Garden %d: 'games' resized from %d to %d, progress preserved." % [index, (garden["games"] as Array).size(), minigame_count])
|
||||||
|
garden["games"] = _resize_games_array(garden["games"] as Array, minigame_count)
|
||||||
|
|
||||||
# Make sure duration arrays match the minigame count
|
# Keep duration metrics aligned with the minigame count, preserving the
|
||||||
|
# recorded times for the slots that remain.
|
||||||
if (garden["last_duration"] as PackedInt32Array).size() != minigame_count:
|
if (garden["last_duration"] as PackedInt32Array).size() != minigame_count:
|
||||||
garden["last_duration"] = _make_zero_durations(minigame_count)
|
garden["last_duration"] = _resize_durations(garden["last_duration"] as PackedInt32Array, minigame_count)
|
||||||
if (garden["total_duration"] as PackedInt32Array).size() != minigame_count:
|
if (garden["total_duration"] as PackedInt32Array).size() != minigame_count:
|
||||||
garden["total_duration"] = _make_zero_durations(minigame_count)
|
garden["total_duration"] = _resize_durations(garden["total_duration"] as PackedInt32Array, minigame_count)
|
||||||
|
|
||||||
# Check value outside of possible enum values
|
# Check value outside of possible enum values
|
||||||
for game_index: int in range((garden["games"] as Array).size()):
|
for game_index: int in range((garden["games"] as Array).size()):
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ func _ready() -> void:
|
|||||||
exercise_option_button_1.add_item(tr(status))
|
exercise_option_button_1.add_item(tr(status))
|
||||||
exercise_option_button_2.add_item(tr(status))
|
exercise_option_button_2.add_item(tr(status))
|
||||||
exercise_option_button_3.add_item(tr(status))
|
exercise_option_button_3.add_item(tr(status))
|
||||||
|
|
||||||
reload()
|
reload()
|
||||||
|
|
||||||
|
|
||||||
@@ -45,77 +45,76 @@ func reload() -> void:
|
|||||||
|
|
||||||
func _set_lesson_number(value: int) -> void:
|
func _set_lesson_number(value: int) -> void:
|
||||||
lesson_number = value
|
lesson_number = value
|
||||||
|
|
||||||
if not lesson_label:
|
if not lesson_label:
|
||||||
return
|
return
|
||||||
|
|
||||||
lesson_label.text = str(lesson_number)
|
lesson_label.text = str(lesson_number)
|
||||||
|
|
||||||
look_and_learn_option_button.select(unlocks[lesson_number]["look_and_learn"] as int)
|
look_and_learn_option_button.select(unlocks[lesson_number]["look_and_learn"] as int)
|
||||||
exercise_option_button_1.select(unlocks[lesson_number]["games"][0] as int)
|
# A lesson can have 1–3 minigames, so only populate the buttons that map to a
|
||||||
exercise_option_button_2.select(unlocks[lesson_number]["games"][1] as int)
|
# real game and disable the surplus ones (the grid keeps all three cells).
|
||||||
exercise_option_button_3.select(unlocks[lesson_number]["games"][2] as int)
|
var games: Array = unlocks[lesson_number]["games"]
|
||||||
|
var exercise_buttons: Array[OptionButton] = [exercise_option_button_1, exercise_option_button_2, exercise_option_button_3]
|
||||||
|
for index: int in range(exercise_buttons.size()):
|
||||||
|
var button: OptionButton = exercise_buttons[index]
|
||||||
|
if index < games.size():
|
||||||
|
button.disabled = false
|
||||||
|
button.select(games[index] as int)
|
||||||
|
else:
|
||||||
|
button.disabled = true
|
||||||
|
button.select(-1)
|
||||||
|
|
||||||
|
|
||||||
func _set_lesson_gps(value: String) -> void:
|
func _set_lesson_gps(value: String) -> void:
|
||||||
lesson_gps = value
|
lesson_gps = value
|
||||||
if not gps_label:
|
if not gps_label:
|
||||||
return
|
return
|
||||||
|
|
||||||
gps_label.text = value
|
gps_label.text = value
|
||||||
|
|
||||||
|
|
||||||
func _on_look_and_learn_option_button_item_selected(index: int) -> void:
|
func _on_look_and_learn_option_button_item_selected(index: int) -> void:
|
||||||
unlocks[lesson_number]["look_and_learn"] = index
|
unlocks[lesson_number]["look_and_learn"] = index
|
||||||
|
|
||||||
if index == StudentProgression.Status.LOCKED:
|
if index == StudentProgression.Status.LOCKED:
|
||||||
if lesson_number == 1:
|
if lesson_number == 1:
|
||||||
unlocks[lesson_number]["look_and_learn"] = StudentProgression.Status.UNLOCKED
|
unlocks[lesson_number]["look_and_learn"] = StudentProgression.Status.UNLOCKED
|
||||||
else:
|
else:
|
||||||
unlocks[lesson_number - 1]["look_and_learn"] = StudentProgression.Status.UNLOCKED
|
unlocks[lesson_number - 1]["look_and_learn"] = StudentProgression.Status.UNLOCKED
|
||||||
unlocks[lesson_number - 1]["games"][0] = StudentProgression.Status.LOCKED
|
_set_lesson_games(lesson_number - 1, StudentProgression.Status.LOCKED)
|
||||||
unlocks[lesson_number - 1]["games"][1] = StudentProgression.Status.LOCKED
|
|
||||||
unlocks[lesson_number - 1]["games"][2] = StudentProgression.Status.LOCKED
|
_set_lesson_games(lesson_number, StudentProgression.Status.LOCKED)
|
||||||
|
|
||||||
unlocks[lesson_number]["games"][0] = StudentProgression.Status.LOCKED
|
|
||||||
unlocks[lesson_number]["games"][1] = StudentProgression.Status.LOCKED
|
|
||||||
unlocks[lesson_number]["games"][2] = StudentProgression.Status.LOCKED
|
|
||||||
|
|
||||||
for lesson: int in unlocks.keys():
|
for lesson: int in unlocks.keys():
|
||||||
if lesson > lesson_number:
|
if lesson > lesson_number:
|
||||||
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED
|
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED
|
||||||
unlocks[lesson]["games"][0] = StudentProgression.Status.LOCKED
|
_set_lesson_games(lesson, StudentProgression.Status.LOCKED)
|
||||||
unlocks[lesson]["games"][1] = StudentProgression.Status.LOCKED
|
|
||||||
unlocks[lesson]["games"][2] = StudentProgression.Status.LOCKED
|
|
||||||
|
|
||||||
elif index == StudentProgression.Status.UNLOCKED:
|
elif index == StudentProgression.Status.UNLOCKED:
|
||||||
unlocks[lesson_number]["games"][0] = StudentProgression.Status.LOCKED
|
_set_lesson_games(lesson_number, StudentProgression.Status.LOCKED)
|
||||||
unlocks[lesson_number]["games"][1] = StudentProgression.Status.LOCKED
|
|
||||||
unlocks[lesson_number]["games"][2] = StudentProgression.Status.LOCKED
|
|
||||||
for lesson: int in unlocks.keys():
|
for lesson: int in unlocks.keys():
|
||||||
if lesson < lesson_number:
|
if lesson < lesson_number:
|
||||||
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.COMPLETED
|
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.COMPLETED
|
||||||
unlocks[lesson]["games"][0] = StudentProgression.Status.COMPLETED
|
_set_lesson_games(lesson, StudentProgression.Status.COMPLETED)
|
||||||
unlocks[lesson]["games"][1] = StudentProgression.Status.COMPLETED
|
|
||||||
unlocks[lesson]["games"][2] = StudentProgression.Status.COMPLETED
|
|
||||||
elif lesson > lesson_number:
|
elif lesson > lesson_number:
|
||||||
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED
|
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED
|
||||||
unlocks[lesson]["games"][0] = StudentProgression.Status.LOCKED
|
_set_lesson_games(lesson, StudentProgression.Status.LOCKED)
|
||||||
unlocks[lesson]["games"][1] = StudentProgression.Status.LOCKED
|
|
||||||
unlocks[lesson]["games"][2] = StudentProgression.Status.LOCKED
|
|
||||||
elif index == StudentProgression.Status.COMPLETED:
|
elif index == StudentProgression.Status.COMPLETED:
|
||||||
unlocks[lesson_number]["games"][0] = StudentProgression.Status.UNLOCKED
|
_set_lesson_games(lesson_number, StudentProgression.Status.UNLOCKED)
|
||||||
unlocks[lesson_number]["games"][1] = StudentProgression.Status.UNLOCKED
|
|
||||||
unlocks[lesson_number]["games"][2] = StudentProgression.Status.UNLOCKED
|
|
||||||
for lesson: int in unlocks.keys():
|
for lesson: int in unlocks.keys():
|
||||||
if lesson < lesson_number:
|
if lesson < lesson_number:
|
||||||
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.COMPLETED
|
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.COMPLETED
|
||||||
unlocks[lesson]["games"][0] = StudentProgression.Status.COMPLETED
|
_set_lesson_games(lesson, StudentProgression.Status.COMPLETED)
|
||||||
unlocks[lesson]["games"][1] = StudentProgression.Status.COMPLETED
|
|
||||||
unlocks[lesson]["games"][2] = StudentProgression.Status.COMPLETED
|
|
||||||
elif lesson > lesson_number:
|
elif lesson > lesson_number:
|
||||||
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED
|
unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED
|
||||||
unlocks[lesson]["games"][0] = StudentProgression.Status.LOCKED
|
_set_lesson_games(lesson, StudentProgression.Status.LOCKED)
|
||||||
unlocks[lesson]["games"][1] = StudentProgression.Status.LOCKED
|
|
||||||
unlocks[lesson]["games"][2] = StudentProgression.Status.LOCKED
|
|
||||||
unlocks_changed.emit()
|
unlocks_changed.emit()
|
||||||
|
|
||||||
|
|
||||||
|
# Sets every minigame of a lesson to the same status, respecting the lesson's
|
||||||
|
# actual minigame count (1–3) rather than assuming a fixed three.
|
||||||
|
func _set_lesson_games(lesson: int, status: StudentProgression.Status) -> void:
|
||||||
|
var games: Array = unlocks[lesson]["games"]
|
||||||
|
for game_index: int in range(games.size()):
|
||||||
|
games[game_index] = status
|
||||||
|
|||||||
Reference in New Issue
Block a user