Super-Mario-Bros-Remastered.../Scripts/Parts/TitleScreen.gd
SkyanUltra c41d6fda47
Some snapshot tools (#680)
variable for easily toggling on and off snapshot mode, and also some simple prints for things like unix time and what snapshot build the game would currently be on upon launch
2025-11-22 16:38:40 +00:00

269 lines
9.6 KiB
GDScript

class_name TitleScreen
extends Level
var selected_index := 0
var active := true
static var title_first_load = true
@onready var cursor = %Cursor
static var last_theme := "Overworld"
var last_campaign := "SMB1"
var has_achievements_to_unlock := false
@export var active_options: TitleScreenOptions = null
var star_offset_x := 0
var star_offset_y := 0
func _enter_tree() -> void:
check_for_unlocked_achievements()
Global.debugged_in = false
Global.current_campaign = Settings.file.game.campaign
Global.in_title_screen = true
Global.current_game_mode = Global.GameMode.NONE
last_campaign = Global.current_campaign
title_first_load = false
func _ready() -> void:
setup_stars()
$CanvasLayer2/VersionLabel/DevBuildWarning.visible = Global.is_snapshot
Global.level_theme_changed.connect(setup_stars)
DiscoLevel.in_disco_level = false
get_tree().paused = false
AudioManager.stop_all_music()
AudioManager.stop_music_override(AudioManager.MUSIC_OVERRIDES.NONE, true)
Global.reset_values()
Global.second_quest = false
SpeedrunHandler.timer = 0
SpeedrunHandler.timer_active = false
SpeedrunHandler.show_timer = false
SpeedrunHandler.ghost_active = false
SpeedrunHandler.ghost_enabled = false
Global.player_ghost.apply_data()
get_tree().call_group("PlayerGhosts", "delete")
Global.current_level = null
Global.world_num = clamp(Global.world_num, 1, get_world_count())
update_title()
func update_title() -> void:
SaveManager.apply_save(SaveManager.load_save(Global.current_campaign))
level_id = Global.level_num - 1
world_id = Global.world_num
update_theme()
await get_tree().physics_frame
$LevelBG.time_of_day = ["Day", "Night"].find(Global.theme_time)
$LevelBG.update_visuals()
func play_bgm() -> void:
if has_achievements_to_unlock:
await get_tree().create_timer(3, false).timeout
has_achievements_to_unlock = false
if Settings.file.audio.menu_bgm == 1:
await get_tree().physics_frame
$BGM.play()
func _process(_delta: float) -> void:
Global.can_time_tick = false
cursor.global_position = active_options.options[active_options.selected_index].global_position - Vector2(8, -4)
$BGM.stream_paused = Settings.file.audio.menu_bgm == 0
if $BGM.is_playing() == false and Settings.file.audio.menu_bgm == 1 and has_achievements_to_unlock == false:
$BGM.play()
func campaign_selected() -> void:
if last_campaign != Global.current_campaign:
last_campaign = Global.current_campaign
update_title()
if Global.current_campaign == "SMBANN":
Global.current_game_mode = Global.GameMode.CAMPAIGN
$CanvasLayer/AllNightNippon/WorldSelect.open()
return
$CanvasLayer/Options1.close()
$CanvasLayer/Options2.open()
func open_story_options() -> void:
if Global.game_beaten:
%QuestSelect.open()
await %QuestSelect.selected
$CanvasLayer/StoryMode/StoryOptions.selected_index = 1
%Options2.close()
$CanvasLayer/StoryMode/StoryOptions/HighScore.text = "Top- " + str(Global.high_score).pad_zeros(6)
$CanvasLayer/Options1.close()
$CanvasLayer/StoryMode/StoryOptions.open()
func continue_story() -> void:
Global.current_game_mode = Global.GameMode.CAMPAIGN
if Global.game_beaten or Global.debug_mode:
go_back_to_first_level()
$CanvasLayer/StoryMode/QuestSelect.open()
else:
$CanvasLayer/StoryMode/NoBeatenCharSelect.open()
func check_for_warpless() -> void:
SpeedrunHandler.is_warp_run = false
SpeedrunHandler.ghost_enabled = false
if SpeedrunHandler.WARP_LEVELS[Global.current_campaign].has(str(Global.world_num) + "-" + str(Global.level_num)):
%SpeedrunTypeSelect.open()
elif (SpeedrunHandler.best_level_any_times.get(str(Global.world_num) + "-" + str(Global.level_num), -1) > -1 or SpeedrunHandler.best_level_warpless_times[Global.world_num - 1][Global.level_num - 1] > -1):
$CanvasLayer/MarathonMode/HasRan/GhostSelect.open()
else: $CanvasLayer/MarathonMode/CharacterSelect.open()
func check_for_ghost() -> void:
SpeedrunHandler.ghost_enabled = false
if SpeedrunHandler.is_warp_run and SpeedrunHandler.best_level_any_times.get(str(Global.world_num) + "-" + str(Global.level_num), -1) > -1:
$CanvasLayer/MarathonMode/HasRan/GhostSelect.open()
elif SpeedrunHandler.best_level_warpless_times[Global.world_num - 1][Global.level_num - 1] > -1 and SpeedrunHandler.is_warp_run == false:
$CanvasLayer/MarathonMode/HasRan/GhostSelect.open()
else:
$CanvasLayer/MarathonMode/HasWarp/CharacterSelect.open()
func get_highscore() -> void:
%HighScore.text = "TOP- " + str(Global.high_score).pad_zeros(6)
if Global.world_num == 1 and Global.level_num == 1 and Global.score <= 0:
%StoryOptions.selected_index = 0
else:
%StoryOptions.selected_index = 1
func clear_stats() -> void:
Global.clear_saved_values()
func go_back_to_first_level() -> void:
Global.world_num = 1
Global.level_num = 1
LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
func start_game() -> void:
PipeCutscene.seen_cutscene = false
first_load = true
Global.reset_values()
LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn")
func start_full_run() -> void:
Global.second_quest = false
Global.current_game_mode = Global.GameMode.MARATHON
SpeedrunHandler.timer = 0
if SpeedrunHandler.is_warp_run:
SpeedrunHandler.best_time = SpeedrunHandler.marathon_best_any_time
else:
SpeedrunHandler.best_time = SpeedrunHandler.marathon_best_warpless_time
SpeedrunHandler.show_timer = true
SpeedrunHandler.timer_active = false
Global.clear_saved_values()
Global.reset_values()
Global.world_num = 1
Global.level_num = 1
LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn")
func start_level_run() -> void:
Global.second_quest = false
Global.current_game_mode = Global.GameMode.MARATHON_PRACTICE
SpeedrunHandler.timer = 0
if SpeedrunHandler.is_warp_run:
SpeedrunHandler.best_time = SpeedrunHandler.best_level_any_times.get(str(Global.world_num) + "-" + str(Global.level_num), -1)
else:
SpeedrunHandler.best_time = SpeedrunHandler.best_level_warpless_times[Global.world_num - 1][Global.level_num - 1]
SpeedrunHandler.show_timer = true
SpeedrunHandler.timer_active = false
SpeedrunHandler.enable_recording = true
Global.clear_saved_values()
Global.reset_values()
LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn")
func _exit_tree() -> void:
Global.in_title_screen = false
func challenge_hunt_selected() -> void:
Global.second_quest = false
Global.current_game_mode = Global.GameMode.CHALLENGE
Global.reset_values()
Global.clear_saved_values()
Global.score = 0
$CanvasLayer/ChallengeHunt/WorldSelect.open()
func challenge_hunt_start() -> void:
Global.second_quest = false
PipeCutscene.seen_cutscene = false
first_load = true
ChallengeModeHandler.red_coins = 0
var value = int(ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1])
for i in [1, 2, 4, 8, 16]: # 5 bits (you can expand this as needed)
if value & i:
ChallengeModeHandler.red_coins += 1
LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
ChallengeModeHandler.current_run_red_coins_collected = ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num -1]
Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn")
func world_9_selected() -> void:
Global.second_quest = false
Global.current_game_mode = Global.GameMode.CAMPAIGN
Global.reset_values()
Global.clear_saved_values()
Global.world_num = 9
Global.level_num = 1
%ExtraWorldSelect.open()
func setup_stars() -> void:
var idx := 0
$Logo/Control/HFlowContainer.position = Vector2(96, 12) + Vector2(star_offset_x, star_offset_y)
$Logo/Control/HFlowContainer.visible = Global.achievements.contains("1")
for i in Global.achievements:
$Logo/Control/HFlowContainer.get_child(idx).visible = (i == "1")
idx += 1
func go_to_achievement_menu() -> void:
Global.transition_to_scene("res://Scenes/Levels/AchievementMenu.tscn")
func go_to_boo_menu() -> void:
Global.transition_to_scene("res://Scenes/Levels/BooRaceMenu.tscn")
func open_options() -> void:
$CanvasLayer/SettingsMenu.open()
active_options.active = false
await $CanvasLayer/SettingsMenu.closed
active_options.active = true
func quit_game() -> void:
get_tree().quit()
func new_game_selected() -> void:
Global.second_quest = false
Global.current_game_mode = Global.GameMode.CAMPAIGN
if Global.game_beaten:
%QuestSelect.open()
else:
$CanvasLayer/StoryMode/NewUnbeatenGame/NoBeatenCharSelect.open()
func continue_game() -> void:
SaveManager.apply_save(SaveManager.load_save(Global.current_campaign))
Global.current_game_mode = Global.GameMode.CAMPAIGN
if Global.game_beaten or Global.debug_mode:
$CanvasLayer/StoryMode/ContinueBeatenGame/WorldSelect.open()
else:
$CanvasLayer/StoryMode/ContinueUnbeatenGame/CharacterSelect.open()
func on_story_options_closed() -> void:
$CanvasLayer/Options2.open()
func go_to_credits() -> void:
CreditsLevel.go_to_title_screen = true
Global.transition_to_scene("res://Scenes/Levels/Credits.tscn")
func check_for_unlocked_achievements() -> void:
var new_achievements := []
var idx := 0
for i in Global.achievements:
if AchievementMenu.unlocked_achievements[idx] != i and i == "1":
new_achievements.append(idx)
idx += 1
if new_achievements.is_empty() == false:
has_achievements_to_unlock = true
%AchievementUnlock.show_popup(new_achievements)
AchievementMenu.unlocked_achievements = Global.achievements
func get_room_type() -> Global.Room:
return Global.Room.TITLE_SCREEN