CustomLevelList.gd 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. extends VBoxContainer
  2. signal level_selected(container: CustomLevelContainer)
  3. const CUSTOM_LEVEL_CONTAINER = preload("uid://dt20tjug8m6oh")
  4. const CUSTOM_LEVEL_PATH := "user://custom_levels/"
  5. const base64_charset := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  6. signal closed
  7. var containers := []
  8. var selected_lvl_idx := -1
  9. func open(refresh_list := true) -> void:
  10. show()
  11. if refresh_list:
  12. refresh()
  13. if selected_lvl_idx >= 0:
  14. %LevelContainers.get_child(selected_lvl_idx).grab_focus()
  15. else:
  16. $TopBit/Button.grab_focus()
  17. await get_tree().process_frame
  18. set_process(true)
  19. func open_folder() -> void:
  20. OS.shell_show_in_file_manager(ProjectSettings.globalize_path(CUSTOM_LEVEL_PATH))
  21. func _process(_delta: float) -> void:
  22. if Input.is_action_just_pressed("ui_back"):
  23. closed.emit()
  24. func close() -> void:
  25. hide()
  26. set_process(false)
  27. func refresh() -> void:
  28. %LevelContainers.get_node("Label").show()
  29. for i in %LevelContainers.get_children():
  30. if i is CustomLevelContainer:
  31. i.queue_free()
  32. containers.clear()
  33. get_levels("user://custom_levels")
  34. get_levels("user://custom_levels/downloaded")
  35. func get_levels(path := "user://custom_levels") -> void:
  36. DirAccess.make_dir_recursive_absolute(path)
  37. var idx := 0
  38. for i in DirAccess.get_files_at(path):
  39. if i.contains(".lvl") == false:
  40. continue
  41. %LevelContainers.get_node("Label").hide()
  42. var container = CUSTOM_LEVEL_CONTAINER.instantiate()
  43. var file = FileAccess.open(path + "/" + i, FileAccess.READ)
  44. var json = JSON.parse_string(file.get_as_text())
  45. file.close()
  46. var data = json["Levels"][0]["Data"].split("=")
  47. var info = json["Info"]
  48. container.level_name = info["Name"]
  49. container.level_author = info["Author"]
  50. container.level_desc = info["Description"]
  51. container.idx = idx
  52. container.file_path = path + "/" + i
  53. container.level_theme = Level.THEME_IDXS[base64_charset.find(data[0])]
  54. container.level_time = base64_charset.find(data[1])
  55. container.game_style = Global.CAMPAIGNS[base64_charset.find(data[3])]
  56. container.selected.connect(container_selected)
  57. containers.append(container)
  58. print(data)
  59. if info.has("Difficulty"):
  60. container.difficulty = info["Difficulty"]
  61. %LevelContainers.add_child(container)
  62. idx += 1
  63. func container_selected(container: CustomLevelContainer) -> void:
  64. level_selected.emit(container)
  65. selected_lvl_idx = container.get_index()