TitleScreen.gd 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. class_name TitleScreen
  2. extends Level
  3. var selected_index := 0
  4. var active := true
  5. static var title_first_load = true
  6. @onready var cursor = %Cursor
  7. static var last_theme := "Overworld"
  8. var has_achievements_to_unlock := false
  9. @export var active_options: TitleScreenOptions = null
  10. var star_offset_x := 0
  11. var star_offset_y := 0
  12. func _enter_tree() -> void:
  13. check_for_unlocked_achievements()
  14. Global.debugged_in = false
  15. Global.current_campaign = Settings.file.game.campaign
  16. Global.in_title_screen = true
  17. Global.current_game_mode = Global.GameMode.NONE
  18. title_first_load = false
  19. func _ready() -> void:
  20. setup_stars()
  21. Global.level_theme_changed.connect(setup_stars)
  22. DiscoLevel.in_disco_level = false
  23. get_tree().paused = false
  24. AudioManager.stop_all_music()
  25. AudioManager.stop_music_override(AudioManager.MUSIC_OVERRIDES.NONE, true)
  26. Global.reset_values()
  27. Global.second_quest = false
  28. SpeedrunHandler.timer = 0
  29. SpeedrunHandler.timer_active = false
  30. SpeedrunHandler.show_timer = false
  31. SpeedrunHandler.ghost_active = false
  32. SpeedrunHandler.ghost_enabled = false
  33. Global.player_ghost.apply_data()
  34. get_tree().call_group("PlayerGhosts", "delete")
  35. Global.current_level = null
  36. Global.world_num = clamp(Global.world_num, 1, 8)
  37. level_id = Global.level_num - 1
  38. world_id = Global.world_num
  39. update_theme()
  40. await get_tree().physics_frame
  41. $LevelBG.time_of_day = ["Day", "Night"].find(Global.theme_time)
  42. $LevelBG.update_visuals()
  43. func play_bgm() -> void:
  44. if has_achievements_to_unlock:
  45. await get_tree().create_timer(3, false).timeout
  46. has_achievements_to_unlock = false
  47. if Settings.file.audio.menu_bgm == 1:
  48. await get_tree().physics_frame
  49. $BGM.play()
  50. func _process(_delta: float) -> void:
  51. Global.can_time_tick = false
  52. cursor.global_position = active_options.options[active_options.selected_index].global_position - Vector2(8, -4)
  53. $BGM.stream_paused = Settings.file.audio.menu_bgm == 0
  54. if $BGM.is_playing() == false and Settings.file.audio.menu_bgm == 1 and has_achievements_to_unlock == false:
  55. $BGM.play()
  56. func campaign_selected() -> void:
  57. SaveManager.apply_save(SaveManager.load_save(Global.current_campaign))
  58. if Global.current_campaign == "SMBANN":
  59. Global.current_game_mode = Global.GameMode.CAMPAIGN
  60. $CanvasLayer/AllNightNippon/WorldSelect.open()
  61. return
  62. $CanvasLayer/Options1.close()
  63. $CanvasLayer/Options2.open()
  64. func open_story_options() -> void:
  65. if Global.game_beaten:
  66. %QuestSelect.open()
  67. await %QuestSelect.selected
  68. $CanvasLayer/StoryMode/StoryOptions.selected_index = 1
  69. %Options2.close()
  70. $CanvasLayer/StoryMode/StoryOptions/HighScore.text = "Top- " + str(Global.high_score).pad_zeros(6)
  71. $CanvasLayer/Options1.close()
  72. $CanvasLayer/StoryMode/StoryOptions.open()
  73. func continue_story() -> void:
  74. Global.current_game_mode = Global.GameMode.CAMPAIGN
  75. if Global.game_beaten or Global.debug_mode:
  76. $CanvasLayer/StoryMode/QuestSelect.open()
  77. else:
  78. $CanvasLayer/StoryMode/NoBeatenCharSelect.open()
  79. func check_for_warpless() -> void:
  80. SpeedrunHandler.is_warp_run = false
  81. SpeedrunHandler.ghost_enabled = false
  82. if SpeedrunHandler.WARP_LEVELS[Global.current_campaign].has(str(Global.world_num) + "-" + str(Global.level_num)):
  83. %SpeedrunTypeSelect.open()
  84. 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):
  85. $CanvasLayer/MarathonMode/HasRan/GhostSelect.open()
  86. else: $CanvasLayer/MarathonMode/CharacterSelect.open()
  87. func check_for_ghost() -> void:
  88. SpeedrunHandler.ghost_enabled = false
  89. if SpeedrunHandler.is_warp_run and SpeedrunHandler.best_level_any_times.get(str(Global.world_num) + "-" + str(Global.level_num), -1) > -1:
  90. $CanvasLayer/MarathonMode/HasRan/GhostSelect.open()
  91. elif SpeedrunHandler.best_level_warpless_times[Global.world_num - 1][Global.level_num - 1] > -1 and SpeedrunHandler.is_warp_run == false:
  92. $CanvasLayer/MarathonMode/HasRan/GhostSelect.open()
  93. else:
  94. $CanvasLayer/MarathonMode/HasWarp/CharacterSelect.open()
  95. func new_game() -> void:
  96. if Global.score > 0 or Global.coins > 0 or Global.player_power_states != "0000" or Global.world_num > 1 or Global.level_num > 1:
  97. $CanvasLayer/SaveDeletionWarning.open()
  98. await $CanvasLayer/SaveDeletionWarning.selected
  99. if $CanvasLayer/SaveDeletionWarning.selected_index == 1:
  100. active_options.active = true
  101. return
  102. Global.current_game_mode = Global.GameMode.CAMPAIGN
  103. SaveManager.clear_save()
  104. start_game()
  105. func start_game() -> void:
  106. PipeCutscene.seen_cutscene = false
  107. first_load = true
  108. Global.reset_values()
  109. LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
  110. Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn")
  111. func start_full_run() -> void:
  112. Global.current_game_mode = Global.GameMode.MARATHON
  113. SpeedrunHandler.timer = 0
  114. if SpeedrunHandler.is_warp_run:
  115. SpeedrunHandler.best_time = SpeedrunHandler.marathon_best_any_time
  116. else:
  117. SpeedrunHandler.best_time = SpeedrunHandler.marathon_best_warpless_time
  118. SpeedrunHandler.show_timer = true
  119. SpeedrunHandler.timer_active = false
  120. Global.clear_saved_values()
  121. Global.reset_values()
  122. Global.world_num = 1
  123. Global.level_num = 1
  124. LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
  125. Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn")
  126. func start_level_run() -> void:
  127. Global.current_game_mode = Global.GameMode.MARATHON_PRACTICE
  128. SpeedrunHandler.timer = 0
  129. if SpeedrunHandler.is_warp_run:
  130. SpeedrunHandler.best_time = SpeedrunHandler.best_level_any_times.get(str(Global.world_num) + "-" + str(Global.level_num), -1)
  131. else:
  132. SpeedrunHandler.best_time = SpeedrunHandler.best_level_warpless_times[Global.world_num - 1][Global.level_num - 1]
  133. SpeedrunHandler.show_timer = true
  134. SpeedrunHandler.timer_active = false
  135. SpeedrunHandler.enable_recording = true
  136. Global.clear_saved_values()
  137. Global.reset_values()
  138. LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
  139. Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn")
  140. func _exit_tree() -> void:
  141. Global.in_title_screen = false
  142. func challenge_hunt_selected() -> void:
  143. Global.current_game_mode = Global.GameMode.CHALLENGE
  144. Global.reset_values()
  145. Global.clear_saved_values()
  146. Global.score = 0
  147. $CanvasLayer/ChallengeHunt/WorldSelect.open()
  148. func challenge_hunt_start() -> void:
  149. Global.second_quest = false
  150. PipeCutscene.seen_cutscene = false
  151. first_load = true
  152. ChallengeModeHandler.red_coins = 0
  153. var value = int(ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1])
  154. for i in [1, 2, 4, 8, 16]: # 5 bits (you can expand this as needed)
  155. if value & i:
  156. ChallengeModeHandler.red_coins += 1
  157. LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
  158. ChallengeModeHandler.current_run_red_coins_collected = ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num -1]
  159. Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn")
  160. func world_9_selected() -> void:
  161. Global.second_quest = false
  162. Global.current_game_mode = Global.GameMode.CAMPAIGN
  163. Global.reset_values()
  164. Global.clear_saved_values()
  165. Global.world_num = 9
  166. Global.level_num = 1
  167. %ExtraWorldSelect.open()
  168. func setup_stars() -> void:
  169. var idx := 0
  170. $Logo/Control/HFlowContainer.position = Vector2(96, 12) + Vector2(star_offset_x, star_offset_y)
  171. $Logo/Control/HFlowContainer.visible = Global.achievements.contains("1")
  172. for i in Global.achievements:
  173. $Logo/Control/HFlowContainer.get_child(idx).visible = (i == "1")
  174. idx += 1
  175. func go_to_achievement_menu() -> void:
  176. Global.transition_to_scene("res://Scenes/Levels/AchievementMenu.tscn")
  177. func go_to_boo_menu() -> void:
  178. Global.transition_to_scene("res://Scenes/Levels/BooRaceMenu.tscn")
  179. func open_options() -> void:
  180. $CanvasLayer/SettingsMenu.open()
  181. active_options.active = false
  182. await $CanvasLayer/SettingsMenu.closed
  183. active_options.active = true
  184. func quit_game() -> void:
  185. get_tree().quit()
  186. func on_story_options_closed() -> void:
  187. $CanvasLayer/Options2.open()
  188. func go_to_credits() -> void:
  189. CreditsLevel.go_to_title_screen = true
  190. Global.transition_to_scene("res://Scenes/Levels/Credits.tscn")
  191. func check_for_unlocked_achievements() -> void:
  192. var new_achievements := []
  193. var idx := 0
  194. for i in Global.achievements:
  195. if AchievementMenu.unlocked_achievements[idx] != i and i == "1":
  196. new_achievements.append(idx)
  197. idx += 1
  198. if new_achievements.is_empty() == false:
  199. has_achievements_to_unlock = true
  200. %AchievementUnlock.show_popup(new_achievements)
  201. AchievementMenu.unlocked_achievements = Global.achievements