| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- extends Control
- var selected_index := 0
- signal selected
- signal cancelled
- var active := false
- @export var campaign_icons: Array[Texture2D] = []
- var old_campaign := ""
- @export var campaign := ["SMB1", "SMBLL", "SMBS", "SMBANN", "Custom"]
- func _ready() -> void:
- get_starting_position()
- handle_visuals()
- func _process(_delta: float) -> void:
- if active:
- handle_input()
- handle_visuals()
- func handle_visuals() -> void:
- %Left.texture = campaign_icons[wrap(selected_index - 1, 0, campaign_icons.size())]
- %Right.texture = campaign_icons[wrap(selected_index + 1, 0, campaign_icons.size())]
- %Middle.texture = campaign_icons[selected_index]
- %BarLabel.text = generate_text()
- for i in %CampaignNames.get_child_count():
- %CampaignNames.get_child(i).visible = selected_index == i
- func generate_text() -> String:
- var string := ""
- string += "◄"
- for i in 5:
- if i == selected_index:
- string += "┼"
- else:
- string += "-"
- string += "►"
- return string
- func open() -> void:
- old_campaign = Global.current_campaign
- Global.current_game_mode = Global.GameMode.NONE
- get_starting_position()
- handle_visuals()
- show()
- await get_tree().process_frame
- active = true
- await selected
- hide()
- func get_starting_position() -> void:
- if CustomLevelMenu.has_entered or selected_index == 4:
- selected_index = 4
- else:
- selected_index = campaign.find(Global.current_campaign)
- func handle_input() -> void:
- if Input.is_action_just_pressed("ui_left"):
- selected_index -= 1
- if Input.is_action_just_pressed("ui_right"):
- selected_index += 1
- selected_index = wrap(selected_index, 0, campaign.size())
- Global.current_campaign = campaign[selected_index]
- if Input.is_action_just_pressed("ui_accept"):
- select()
- elif Input.is_action_just_pressed("ui_back"):
- close()
- Global.current_campaign = old_campaign
- cancelled.emit()
- return
- func select() -> void:
- CustomLevelMenu.has_entered = false
- if selected_index == 4:
- Global.current_campaign = "SMB1"
- Global.transition_to_scene("res://Scenes/Levels/CustomLevelMenu.tscn")
- return
- active = false
- Settings.file.game.campaign = Global.current_campaign
- SaveManager.apply_save(SaveManager.load_save(campaign[selected_index]))
- if Global.current_campaign != "SMBANN":
- SpeedrunHandler.load_best_times()
- Settings.save_settings()
- selected.emit()
- hide()
- if old_campaign != Global.current_campaign:
- Global.freeze_screen()
- ResourceSetter.cache.clear()
- ResourceSetterNew.cache.clear()
- Global.level_theme_changed.emit()
- for i in 2:
- await get_tree().process_frame
- Global.close_freeze()
- func close() -> void:
- CustomLevelMenu.has_entered = false
- active = false
- hide()
|