Files
Super-Mario-Bros.-Remastere…/Scripts/UI/CampaignSelect.gd
2025-09-13 16:30:32 +01:00

102 lines
2.6 KiB
GDScript

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()