| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- extends Node2D
- var moving := false
- @export var path: PathFollow2D = null
- @export var time_needed := [60, 45, 30]
- const COLOURS := ["White", "Green", "Red", "Black", "Gold"]
- var last_position := global_position
- var tween: Tween = null
- @export var force_colour := -1
- func play_laugh_animation() -> void:
- if get_tree().get_nodes_in_group("BooSwitchBlocks").is_empty() == false:
- $Warning.show()
- $Sprite.play("Laugh")
- await get_tree().create_timer(1, false).timeout
- $Warning.hide()
- if moving:
- $Sprite.play("Idle")
- func _ready() -> void:
- if force_colour != -1:
- BooRaceHandler.boo_colour = force_colour
- $Sprite.play("Lose")
- $OffScreenIcon.frame = BooRaceHandler.boo_colour
- $GoldParticles.visible = BooRaceHandler.boo_colour == 4
- get_tree().get_first_node_in_group("Players").dead.connect(func(): $Sprite.play("Win"))
- func _process(_delta: float) -> void:
- if Global.current_game_mode == Global.GameMode.BOO_RACE:
- handle_off_screen_icon()
- func handle_off_screen_icon() -> void:
- $OffScreenIcon.visible = $Sprite/VisibleOnScreenNotifier2D.is_on_screen() == false and moving
- var sprite_position = $Sprite.global_position
- var screen_center = get_viewport().get_camera_2d().get_screen_center_position()
- var screen_size = get_viewport().get_visible_rect().size
- sprite_position.x = clamp(sprite_position.x, (screen_center.x - (screen_size.x / 2)) + 8, (screen_center.x + (screen_size.x / 2)) - 8)
- sprite_position.y = clamp(sprite_position.y, (screen_center.y - (screen_size.y / 2)) + 8, (screen_center.y + (screen_size.y / 2)) - 8)
- $OffScreenIcon.global_position = sprite_position
- if global_position.x > get_tree().get_first_node_in_group("Players").global_position.x and path.progress_ratio >= 0.8:
- $OffScreenIcon/Animation.play("CloseFlash")
- $Sprite.play("Win")
- func _physics_process(_delta: float) -> void:
- var dir = sign(global_position.x - last_position.x)
- if moving and dir != 0:
- $Sprite.scale.x = dir
- last_position = global_position
- func flag_die() -> void:
- tween.kill()
- $Sprite.play("Lose")
- moving = false
- func move_tween() -> void:
- if path == null:
- return
- moving = true
- $Sprite.play("Idle")
- tween = create_tween()
- tween.tween_property(path, "progress_ratio", 1, time_needed[BooRaceHandler.boo_colour])
- await tween.finished
- boo_win()
- func boo_win() -> void:
- $Sprite.play("Win")
- get_tree().call_group("Players", "time_up")
|