CampaignSelect.gd 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. extends Control
  2. var selected_index := 0
  3. signal selected
  4. signal cancelled
  5. var active := false
  6. @export var campaign_icons: Array[Texture2D] = []
  7. var old_campaign := ""
  8. @export var campaign := ["SMB1", "SMBLL", "SMBS", "SMBANN", "Custom"]
  9. func _ready() -> void:
  10. get_starting_position()
  11. handle_visuals()
  12. func _process(_delta: float) -> void:
  13. if active:
  14. handle_input()
  15. handle_visuals()
  16. func handle_visuals() -> void:
  17. %Left.texture = campaign_icons[wrap(selected_index - 1, 0, campaign_icons.size())]
  18. %Right.texture = campaign_icons[wrap(selected_index + 1, 0, campaign_icons.size())]
  19. %Middle.texture = campaign_icons[selected_index]
  20. %BarLabel.text = generate_text()
  21. for i in %CampaignNames.get_child_count():
  22. %CampaignNames.get_child(i).visible = selected_index == i
  23. func generate_text() -> String:
  24. var string := ""
  25. string += "◄"
  26. for i in 5:
  27. if i == selected_index:
  28. string += "┼"
  29. else:
  30. string += "-"
  31. string += "►"
  32. return string
  33. func open() -> void:
  34. old_campaign = Global.current_campaign
  35. Global.current_game_mode = Global.GameMode.NONE
  36. get_starting_position()
  37. handle_visuals()
  38. show()
  39. await get_tree().process_frame
  40. active = true
  41. await selected
  42. hide()
  43. func get_starting_position() -> void:
  44. if CustomLevelMenu.has_entered or selected_index == 4:
  45. selected_index = 4
  46. else:
  47. selected_index = campaign.find(Global.current_campaign)
  48. func handle_input() -> void:
  49. if Input.is_action_just_pressed("ui_left"):
  50. selected_index -= 1
  51. if Input.is_action_just_pressed("ui_right"):
  52. selected_index += 1
  53. selected_index = wrap(selected_index, 0, campaign.size())
  54. Global.current_campaign = campaign[selected_index]
  55. if Input.is_action_just_pressed("ui_accept"):
  56. select()
  57. elif Input.is_action_just_pressed("ui_back"):
  58. close()
  59. Global.current_campaign = old_campaign
  60. cancelled.emit()
  61. return
  62. func select() -> void:
  63. CustomLevelMenu.has_entered = false
  64. if selected_index == 4:
  65. Global.current_campaign = "SMB1"
  66. Global.transition_to_scene("res://Scenes/Levels/CustomLevelMenu.tscn")
  67. return
  68. active = false
  69. Settings.file.game.campaign = Global.current_campaign
  70. SaveManager.apply_save(SaveManager.load_save(campaign[selected_index]))
  71. if Global.current_campaign != "SMBANN":
  72. SpeedrunHandler.load_best_times()
  73. Settings.save_settings()
  74. selected.emit()
  75. hide()
  76. if old_campaign != Global.current_campaign:
  77. Global.freeze_screen()
  78. ResourceSetter.cache.clear()
  79. ResourceSetterNew.cache.clear()
  80. Global.level_theme_changed.emit()
  81. for i in 2:
  82. await get_tree().process_frame
  83. Global.close_freeze()
  84. func close() -> void:
  85. CustomLevelMenu.has_entered = false
  86. active = false
  87. hide()