ChallengeModeResults.gd 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. extends Node
  2. @export var can_exit := false
  3. func _enter_tree() -> void:
  4. Global.get_node("GameHUD").hide()
  5. var coin_medal := true
  6. var score_medal := false
  7. var yoshi_medal := false
  8. var exiting := false
  9. func _ready() -> void:
  10. var your_results = tr("CHALLENGE_DIALOGUE_RESULTS").split(" ")
  11. $SpeechBubble/Your.text = your_results[0]
  12. $SpeechBubble/Your/Results.text = your_results[1]
  13. coin_medal = int(ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1]) & 0b011111 == 0b011111
  14. score_medal = ChallengeModeHandler.top_challenge_scores[Global.world_num -1][Global.level_num - 1] >= ChallengeModeHandler.CHALLENGE_TARGETS[Global.current_campaign][Global.world_num -1][Global.level_num -1]
  15. yoshi_medal = ChallengeModeHandler.is_coin_collected(ChallengeModeHandler.CoinValues.YOSHI_EGG, ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1])
  16. setup_results()
  17. func _process(_delta: float) -> void:
  18. if can_exit and Input.is_action_just_pressed("jump_0"):
  19. can_exit = false
  20. exiting = true
  21. save_results()
  22. $Music.stop()
  23. $Music.stream = preload("res://Assets/Audio/BGM/ChallengeEnd.mp3")
  24. $Music.play()
  25. await $Music.finished
  26. open_menu()
  27. Engine.time_scale = 5 if Input.is_action_pressed("jump_0") and can_exit == false and exiting == false else 1
  28. func open_menu() -> void:
  29. $CanvasLayer/PauseMenu.open()
  30. func save_results() -> void:
  31. var index := 0
  32. ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1] = int(ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1]) | ChallengeModeHandler.current_run_red_coins_collected
  33. if Global.score >= ChallengeModeHandler.top_challenge_scores[Global.world_num - 1][Global.level_num - 1]:
  34. ChallengeModeHandler.top_challenge_scores[Global.world_num - 1][Global.level_num - 1] = Global.score
  35. ChallengeModeHandler.new().check_for_achievement()
  36. SaveManager.write_save()
  37. func retry_level() -> void:
  38. Global.player_power_states = "0000"
  39. ChallengeModeHandler.current_run_red_coins_collected = ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1]
  40. Global.score = 0
  41. LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num)
  42. Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn")
  43. func go_to_title_screen() -> void:
  44. Global.transition_to_scene("res://Scenes/Levels/TitleScreen.tscn")
  45. func _exit_tree() -> void:
  46. Global.get_node("GameHUD").show()
  47. Engine.time_scale = 1
  48. func setup_results() -> void:
  49. $Sprite2D3/RedCoins.visible = coin_medal
  50. $Sprite2D3/Score.visible = score_medal
  51. $Sprite2D3/YoshiEgg.visible = yoshi_medal
  52. $SpeechBubble/Score/ScoreLabel.text = str(Global.score)
  53. var idx = 0
  54. for i in $Sprite2D/Sprite2D3/Coins.get_children():
  55. if ChallengeModeHandler.is_coin_collected(idx, ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1]):
  56. i.frame = 1
  57. else:
  58. i.frame = 0
  59. idx += 1
  60. idx = 0
  61. for i in $SpeechBubble/Coins/Node2D.get_children():
  62. i.frame = int(ChallengeModeHandler.is_coin_collected(idx))
  63. idx += 1
  64. $Sprite2D/Sprite2D3/ScoreText/Target.text = "/ " + str(ChallengeModeHandler.CHALLENGE_TARGETS[Global.current_campaign][Global.world_num - 1][Global.level_num - 1])
  65. $WorldLevel.text = str(Global.world_num) + "-" + str(Global.level_num)
  66. $Yoshi.play(["Green", "Yellow", "Red", "Blue"][Global.level_num - 1])
  67. func update_coins_display() -> void:
  68. var idx := 0
  69. for i in $Sprite2D/Sprite2D3/Coins.get_children():
  70. if ChallengeModeHandler.is_coin_collected(idx):
  71. i.frame = 1
  72. idx += 1
  73. func update_score() -> void:
  74. $Sprite2D/Sprite2D3/ScoreText.text = str(Global.score)
  75. func give_red_coin_medal() -> void:
  76. const mask = (1 << ChallengeModeHandler.CoinValues.R_COIN_1) | (1 << ChallengeModeHandler.CoinValues.R_COIN_2) | (1 << ChallengeModeHandler.CoinValues.R_COIN_3) | (1 << ChallengeModeHandler.CoinValues.R_COIN_4) | (1 << ChallengeModeHandler.CoinValues.R_COIN_5)
  77. var valid := (ChallengeModeHandler.current_run_red_coins_collected & mask) == mask
  78. if valid and not coin_medal:
  79. do_medal_give_animation($Sprite2D3/RedCoins)
  80. func give_score_medal() -> void:
  81. if Global.score >= ChallengeModeHandler.CHALLENGE_TARGETS[Global.current_campaign][Global.world_num - 1][Global.level_num - 1] and not score_medal:
  82. do_medal_give_animation($Sprite2D3/Score)
  83. func give_yoshi_medal() -> void:
  84. if ChallengeModeHandler.is_coin_collected(ChallengeModeHandler.CoinValues.YOSHI_EGG):
  85. $SmokeParticle.play()
  86. $Yoshi/AudioStreamPlayer2D.play()
  87. $Yoshi.show()
  88. if yoshi_medal == false:
  89. await get_tree().create_timer(0.5, false).timeout
  90. do_medal_give_animation($Sprite2D3/YoshiEgg)
  91. func do_medal_give_animation(medal: Node) -> void:
  92. $AudioStreamPlayer2.play()
  93. get_tree().paused = true
  94. for i in 4:
  95. medal.hide()
  96. await get_tree().create_timer(0.1, true).timeout
  97. medal.show()
  98. await get_tree().create_timer(0.1, true).timeout
  99. get_tree().paused = false