WorldSelect.gd 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. extends Control
  2. var selected_world := 0
  3. @export var world_offset := 0
  4. @export var num_of_worlds := 7
  5. signal world_selected
  6. signal cancelled
  7. var active := false
  8. var cursor_index := 0
  9. var starting_value := -1
  10. const NUMBER_Y := [
  11. "Overworld",
  12. "Underground",
  13. "Castle",
  14. "Snow",
  15. "Space",
  16. "Volcano"
  17. ]
  18. func _ready() -> void:
  19. for i in %SlotContainer.get_children():
  20. i.focus_entered.connect(slot_focused.bind(i.get_index()))
  21. func _process(_delta: float) -> void:
  22. if active:
  23. handle_input()
  24. Global.world_num = selected_world + 1 + world_offset
  25. func open() -> void:
  26. if starting_value == -1:
  27. starting_value = Global.world_num
  28. selected_world = Global.world_num - 1 - world_offset
  29. setup_visuals()
  30. show()
  31. await get_tree().process_frame
  32. $%SlotContainer.get_child(selected_world).grab_focus()
  33. active = true
  34. func setup_visuals() -> void:
  35. var idx := 0
  36. %Slot1.focus_neighbor_left = %Slot8.get_path()
  37. %Slot8.focus_neighbor_right = %Slot1.get_path()
  38. if Global.current_campaign == "SMBLL" && (Global.game_beaten or Global.debug_mode) && Global.current_game_mode == Global.GameMode.CAMPAIGN:
  39. %Slot1.focus_neighbor_left = %Slot13.get_path()
  40. %Slot8.focus_neighbor_right = %Slot9.get_path()
  41. for i in %SlotContainer.get_children():
  42. if idx >= 8:
  43. i.visible = Global.current_campaign == "SMBLL" && (Global.game_beaten or Global.debug_mode) && Global.current_game_mode == Global.GameMode.CAMPAIGN
  44. if i.visible == false:
  45. idx += 1
  46. continue
  47. var level_theme = Global.LEVEL_THEMES[Global.current_campaign][idx + world_offset]
  48. var world_visited = (SaveManager.visited_levels.substr((idx + world_offset) * 4, 4) != "0000" or Global.debug_mode or idx == 0)
  49. if world_visited == false:
  50. level_theme = "Mystery"
  51. i.get_node("Icon").region_rect = CustomLevelContainer.THEME_RECTS[level_theme]
  52. i.get_node("Icon").texture = CustomLevelContainer.ICON_TEXTURES[0 if (idx <= 3 or idx >= 8) and Global.current_campaign != "SMBANN" else 1]
  53. i.get_node("Icon/Number").region_rect.position.y = clamp(NUMBER_Y.find(level_theme) * 12, 0, 9999)
  54. i.get_node("Icon/Number").region_rect.position.x = (idx + world_offset) * 12
  55. idx += 1
  56. func handle_input() -> void:
  57. if Input.is_action_just_pressed("ui_accept"):
  58. if SaveManager.visited_levels.substr((selected_world + world_offset) * 4, 4) == "0000" and not Global.debug_mode and selected_world != 0:
  59. AudioManager.play_sfx("bump")
  60. else:
  61. select_world()
  62. elif Input.is_action_just_pressed("ui_back"):
  63. close()
  64. cleanup()
  65. cancelled.emit()
  66. return
  67. func slot_focused(idx := 0) -> void:
  68. selected_world = idx
  69. func select_world() -> void:
  70. if owner is Level:
  71. owner.world_id = selected_world + world_offset + 1
  72. Global.world_num = selected_world + world_offset + 1
  73. world_selected.emit()
  74. close()
  75. func cleanup() -> void:
  76. await get_tree().physics_frame
  77. Global.world_num = starting_value
  78. starting_value = -1
  79. Global.world_num = clamp(Global.world_num, 1, 8)
  80. if owner is Level:
  81. owner.world_id = clamp(owner.world_id, 1, 8)
  82. func close() -> void:
  83. active = false
  84. Global.world_num = 1
  85. hide()