CastleBridge.gd 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. extends Node2D
  2. signal victory_begin
  3. const CASTLE_COMPLETE = preload("res://Assets/Audio/BGM/CastleComplete.mp3")
  4. var cam_move := false
  5. @export_range(8, 20, 1) var length := 13
  6. @export var end_timer := false
  7. @export var do_tally := true
  8. signal axe_touched
  9. var bowser_present := true
  10. func _ready() -> void:
  11. await get_tree().physics_frame
  12. $Axe/CameraRightLimit._enter_tree()
  13. func on_area_entered(area: Area2D) -> void:
  14. if area.owner is Player:
  15. destroy_bridge(area.owner)
  16. func destroy_bridge(player: Player) -> void:
  17. Global.can_pause = false
  18. for i in get_tree().get_nodes_in_group("Enemies"):
  19. if i is BowserFlame:
  20. i.queue_free()
  21. elif i is Hammer:
  22. i.queue_free()
  23. if (end_timer and Global.current_game_mode == Global.GameMode.MARATHON) or Global.current_game_mode == Global.GameMode.MARATHON_PRACTICE:
  24. SpeedrunHandler.run_finished()
  25. if end_timer:
  26. if Global.world_num > 8:
  27. Global.unlock_achievement(Global.AchievementID.SMBLL_WORLD9)
  28. match Global.current_campaign:
  29. "SMB1": Global.unlock_achievement(Global.AchievementID.SMB1_CLEAR)
  30. "SMBLL": Global.unlock_achievement(Global.AchievementID.SMBLL_CLEAR)
  31. "SMBS": Global.unlock_achievement(Global.AchievementID.SMBS_CLEAR)
  32. "SMBANN": Global.unlock_achievement(Global.AchievementID.SMBANN_CLEAR)
  33. bowser_present = get_tree().get_first_node_in_group("Bowser") != null
  34. player.velocity = Vector2.ZERO
  35. Global.can_time_tick = false
  36. axe_touched.emit()
  37. $Axe.queue_free()
  38. if bowser_present:
  39. for i in get_tree().get_nodes_in_group("Bowser"):
  40. i.bridge_fall()
  41. get_tree().paused = true
  42. await get_tree().create_timer(0.5).timeout
  43. for i in $Bridge.get_children():
  44. if i.visible:
  45. AudioManager.play_sfx("block_break", i.global_position)
  46. if Settings.file.visuals.bridge_animation == 0:
  47. bridge_piece_break(i)
  48. else:
  49. bridge_piece_fall(i)
  50. await get_tree().create_timer(0.1).timeout
  51. await get_tree().create_timer(1.5).timeout
  52. get_tree().paused = false
  53. victory_sequence(player)
  54. func bridge_piece_fall(node: Node2D) -> void:
  55. var tween = create_tween()
  56. tween.set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_SINE)
  57. tween.tween_property(node, "global_position:y", node.global_position.y + 128, 0.5)
  58. const BRIDGE_DESTRUCTION_PARTICLE = preload("uid://cwfjdgsyh35h6")
  59. func bridge_piece_break(node: Node2D) -> void:
  60. var particle = BRIDGE_DESTRUCTION_PARTICLE.instantiate()
  61. particle.global_position = node.global_position
  62. particle.process_mode = Node.PROCESS_MODE_ALWAYS
  63. add_sibling(particle)
  64. node.modulate.a = 0
  65. func _physics_process(delta: float) -> void:
  66. if cam_move and $Camera.global_position.x < Player.camera_right_limit:
  67. $Camera.global_position.x += 96 * delta
  68. $Camera.global_position.x = clamp($Camera.global_position.x, -INF, Player.camera_right_limit)
  69. func victory_sequence(player: Player) -> void:
  70. get_tree().call_group("Enemies", "flag_die")
  71. Global.level_complete_begin.emit()
  72. victory_begin.emit()
  73. cam_move = true
  74. $Camera.limit_right = Player.camera_right_limit
  75. $Camera.global_position = get_viewport().get_camera_2d().get_screen_center_position()
  76. $Camera.reset_physics_interpolation()
  77. player.state_machine.transition_to("LevelExit")
  78. $Camera.make_current()
  79. if Global.current_game_mode == Global.GameMode.BOO_RACE:
  80. AudioManager.set_music_override(AudioManager.MUSIC_OVERRIDES.RACE_WIN, 99, false)
  81. await AudioManager.music_override_player.finished
  82. Global.current_level.transition_to_next_level()
  83. else:
  84. AudioManager.set_music_override(AudioManager.MUSIC_OVERRIDES.CASTLE_COMPLETE, 99, false)
  85. await get_tree().create_timer(1, false).timeout
  86. if do_tally:
  87. Global.tally_time()
  88. func on_victory_begin() -> void:
  89. pass # Replace with function body.