| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- extends Control
- var selected_world := 0
- @export var world_offset := 0
- @export var num_of_worlds := 7
- signal world_selected
- signal cancelled
- var active := false
- var cursor_index := 0
- var starting_value := -1
- const NUMBER_Y := [
- "Overworld",
- "Underground",
- "Castle",
- "Snow",
- "Space",
- "Volcano"
- ]
- func _ready() -> void:
- for i in %SlotContainer.get_children():
- i.focus_entered.connect(slot_focused.bind(i.get_index()))
- func _process(_delta: float) -> void:
- if active:
- handle_input()
- Global.world_num = selected_world + 1 + world_offset
- func open() -> void:
- if starting_value == -1:
- starting_value = Global.world_num
- selected_world = Global.world_num - 1 - world_offset
- setup_visuals()
- show()
- await get_tree().process_frame
- $%SlotContainer.get_child(selected_world).grab_focus()
- active = true
- func setup_visuals() -> void:
- var idx := 0
- %Slot1.focus_neighbor_left = %Slot8.get_path()
- %Slot8.focus_neighbor_right = %Slot1.get_path()
- if Global.current_campaign == "SMBLL" && (Global.game_beaten or Global.debug_mode) && Global.current_game_mode == Global.GameMode.CAMPAIGN:
- %Slot1.focus_neighbor_left = %Slot13.get_path()
- %Slot8.focus_neighbor_right = %Slot9.get_path()
- for i in %SlotContainer.get_children():
- if idx >= 8:
- i.visible = Global.current_campaign == "SMBLL" && (Global.game_beaten or Global.debug_mode) && Global.current_game_mode == Global.GameMode.CAMPAIGN
- if i.visible == false:
- idx += 1
- continue
- var level_theme = Global.LEVEL_THEMES[Global.current_campaign][idx + world_offset]
- var world_visited = (SaveManager.visited_levels.substr((idx + world_offset) * 4, 4) != "0000" or Global.debug_mode or idx == 0)
- if world_visited == false:
- level_theme = "Mystery"
- i.get_node("Icon").region_rect = CustomLevelContainer.THEME_RECTS[level_theme]
- i.get_node("Icon").texture = CustomLevelContainer.ICON_TEXTURES[0 if (idx <= 3 or idx >= 8) and Global.current_campaign != "SMBANN" else 1]
- i.get_node("Icon/Number").region_rect.position.y = clamp(NUMBER_Y.find(level_theme) * 12, 0, 9999)
- i.get_node("Icon/Number").region_rect.position.x = (idx + world_offset) * 12
- idx += 1
- func handle_input() -> void:
- if Input.is_action_just_pressed("ui_accept"):
- if SaveManager.visited_levels.substr((selected_world + world_offset) * 4, 4) == "0000" and not Global.debug_mode and selected_world != 0:
- AudioManager.play_sfx("bump")
- else:
- select_world()
- elif Input.is_action_just_pressed("ui_back"):
- close()
- cleanup()
- cancelled.emit()
- return
- func slot_focused(idx := 0) -> void:
- selected_world = idx
- func select_world() -> void:
- if owner is Level:
- owner.world_id = selected_world + world_offset + 1
- Global.world_num = selected_world + world_offset + 1
- world_selected.emit()
- close()
- func cleanup() -> void:
- await get_tree().physics_frame
- Global.world_num = starting_value
- starting_value = -1
- Global.world_num = clamp(Global.world_num, 1, 8)
- if owner is Level:
- owner.world_id = clamp(owner.world_id, 1, 8)
- func close() -> void:
- active = false
- Global.world_num = 1
- hide()
|