mirror of
				https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
				synced 2025-10-26 09:20:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			269 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			9.5 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()
 | |
| 	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
 | 
