DiscoLevel.gd 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. class_name DiscoLevel
  2. extends Node
  3. @export var combo_meter_rate := 1.0
  4. @export var max_combo := 30.0
  5. @export var disco_lighting: Parallax2D = null
  6. static var combo_amount := 0:
  7. set(value):
  8. if value > combo_amount:
  9. combo_meter = 100
  10. combo_amount = value
  11. static var score_mult := 0
  12. static var combo_meter := 0.0
  13. static var in_disco_level := false
  14. static var combo_breaks := 0
  15. static var giving_score := false
  16. static var max_combo_amount := 0.0
  17. static var first_load := true
  18. static var can_meter_tick := true
  19. const RANK_AMOUNTS := {0: "F", 0.25: "D", 0.45: "C", 0.6: "B", 0.8: "A", 1: "S"}
  20. const RANKS := "FDCBASP"
  21. static var current_rank := ""
  22. static var active := false
  23. const S_RANK_SCORES := [
  24. [45000, 40000, 25000, 12000],
  25. [52500, 25000, 25000, 12000],
  26. [45000, 45000, 25000, 12000],
  27. [45000, 45000, 25000, 12000],
  28. [45000, 40000, 30000, 12000],
  29. [30000, 45000, 20000, 12000],
  30. [45000, 25000, 30000, 12000],
  31. [45000, 45000, 45000, 12000]
  32. ]
  33. static var level_ranks := "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
  34. const RANK_IDs := ["F", "D", "C", "B", "A", "S", "P"]
  35. func _ready() -> void:
  36. active = true
  37. Global.current_campaign = "SMBANN"
  38. if get_parent().get_node_or_null("EndFlagpole") != null:
  39. get_parent().get_node("EndFlagpole").player_reached.connect(level_finished)
  40. if get_parent().get_node_or_null("CastleBridge") != null:
  41. get_parent().get_node("CastleBridge").victory_begin.connect(level_finished)
  42. can_meter_tick = true
  43. if DiscoLevel.first_load == true:
  44. max_combo_amount = max_combo
  45. reset_values()
  46. DiscoLevel.first_load = false
  47. in_disco_level = true
  48. static func reset_values() -> void:
  49. combo_amount = 0
  50. combo_meter = 0
  51. first_load = false
  52. if Global.current_campaign == "SMBANN":
  53. Global.score = 0
  54. combo_breaks = 0
  55. current_rank = "F"
  56. Player.times_hit = 0
  57. Global.player_power_states = "0000"
  58. func _physics_process(delta: float) -> void:
  59. if not active:
  60. return
  61. if can_meter_tick:
  62. combo_meter = clamp(combo_meter - 24 * combo_meter_rate * delta, 0, 100)
  63. if combo_meter <= 0 and combo_amount > 0 and not giving_score:
  64. if combo_amount > 2 or current_rank == "P" or current_rank == "S":
  65. AudioManager.play_global_sfx("combo_lost")
  66. give_points(combo_amount)
  67. combo_amount = 0
  68. combo_breaks += 1
  69. var old_rank = current_rank
  70. current_rank = "F"
  71. for i in RANK_AMOUNTS.keys():
  72. if (Global.score + (combo_amount * 500) + (Global.time * 50)) >= (S_RANK_SCORES[Global.world_num - 1][Global.level_num - 1] * i):
  73. current_rank = RANK_AMOUNTS[i]
  74. if current_rank == "S" and combo_breaks <= 0 and combo_amount >= 1:
  75. current_rank = "P"
  76. if RANKS.find(current_rank) > RANKS.find(old_rank):
  77. if current_rank == "S" or current_rank == "P":
  78. AudioManager.play_global_sfx("rank_up_2")
  79. elif combo_amount > 0:
  80. AudioManager.play_global_sfx("rank_up_1")
  81. elif RANKS.find(current_rank) < RANKS.find(old_rank):
  82. AudioManager.play_global_sfx("rank_down")
  83. func give_points(amount := 0) -> void:
  84. await get_tree().create_timer(0.5, false).timeout
  85. for i in amount * 4:
  86. Global.score += 125
  87. AudioManager.play_global_sfx("score")
  88. await get_tree().physics_frame
  89. AudioManager.play_global_sfx("score_end")
  90. AudioManager.kill_sfx("score")
  91. func _exit_tree() -> void:
  92. Global.tallying_score = false
  93. AudioManager.kill_sfx("score")
  94. func level_finished() -> void:
  95. if Global.world_num != 8 && Global.level_num != 4:
  96. SaveManager.visited_levels[SaveManager.get_level_idx(Global.world_num, Global.level_num) + 1] = "1"
  97. Global.score += (combo_amount * 500)
  98. combo_meter = 100
  99. _physics_process(0)
  100. can_meter_tick = false
  101. await Global.score_tally_finished
  102. active = false
  103. write_final_rank()
  104. func write_final_rank() -> void:
  105. if ChallengeModeHandler.top_challenge_scores[Global.world_num - 1][Global.level_num - 1] < Global.score:
  106. ChallengeModeHandler.top_challenge_scores[Global.world_num - 1][Global.level_num - 1] = Global.score
  107. if RANK_IDs.find(level_ranks[SaveManager.get_level_idx(Global.world_num, Global.level_num)]) < RANK_IDs.find(current_rank):
  108. level_ranks[SaveManager.get_level_idx(Global.world_num, Global.level_num)] = current_rank
  109. check_for_p_rank_achievement()
  110. SaveManager.write_save("SMBANN")
  111. func check_for_p_rank_achievement() -> void:
  112. if level_ranks == "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP":
  113. Global.unlock_achievement(Global.AchievementID.ANN_PRANK)