RaceBoo.gd 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. extends Node2D
  2. var moving := false
  3. @export var path: PathFollow2D = null
  4. @export var time_needed := [60, 45, 30]
  5. const COLOURS := ["White", "Green", "Red", "Black", "Gold"]
  6. var last_position := global_position
  7. var tween: Tween = null
  8. @export var force_colour := -1
  9. func play_laugh_animation() -> void:
  10. if get_tree().get_nodes_in_group("BooSwitchBlocks").is_empty() == false:
  11. $Warning.show()
  12. $Sprite.play("Laugh")
  13. await get_tree().create_timer(1, false).timeout
  14. $Warning.hide()
  15. if moving:
  16. $Sprite.play("Idle")
  17. func _ready() -> void:
  18. if force_colour != -1:
  19. BooRaceHandler.boo_colour = force_colour
  20. $Sprite.play("Lose")
  21. $OffScreenIcon.frame = BooRaceHandler.boo_colour
  22. $GoldParticles.visible = BooRaceHandler.boo_colour == 4
  23. get_tree().get_first_node_in_group("Players").dead.connect(func(): $Sprite.play("Win"))
  24. func _process(_delta: float) -> void:
  25. if Global.current_game_mode == Global.GameMode.BOO_RACE:
  26. handle_off_screen_icon()
  27. func handle_off_screen_icon() -> void:
  28. $OffScreenIcon.visible = $Sprite/VisibleOnScreenNotifier2D.is_on_screen() == false and moving
  29. var sprite_position = $Sprite.global_position
  30. var screen_center = get_viewport().get_camera_2d().get_screen_center_position()
  31. var screen_size = get_viewport().get_visible_rect().size
  32. sprite_position.x = clamp(sprite_position.x, (screen_center.x - (screen_size.x / 2)) + 8, (screen_center.x + (screen_size.x / 2)) - 8)
  33. sprite_position.y = clamp(sprite_position.y, (screen_center.y - (screen_size.y / 2)) + 8, (screen_center.y + (screen_size.y / 2)) - 8)
  34. $OffScreenIcon.global_position = sprite_position
  35. if global_position.x > get_tree().get_first_node_in_group("Players").global_position.x and path.progress_ratio >= 0.8:
  36. $OffScreenIcon/Animation.play("CloseFlash")
  37. $Sprite.play("Win")
  38. func _physics_process(_delta: float) -> void:
  39. var dir = sign(global_position.x - last_position.x)
  40. if moving and dir != 0:
  41. $Sprite.scale.x = dir
  42. last_position = global_position
  43. func flag_die() -> void:
  44. tween.kill()
  45. $Sprite.play("Lose")
  46. moving = false
  47. func move_tween() -> void:
  48. if path == null:
  49. return
  50. moving = true
  51. $Sprite.play("Idle")
  52. tween = create_tween()
  53. tween.tween_property(path, "progress_ratio", 1, time_needed[BooRaceHandler.boo_colour])
  54. await tween.finished
  55. boo_win()
  56. func boo_win() -> void:
  57. $Sprite.play("Win")
  58. get_tree().call_group("Players", "time_up")