| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- class_name Thwomp
- extends Enemy
- enum States{IDLE, FALLING, LANDED, RISING}
- var current_state := States.IDLE
- @onready var starting_y := global_position.y
- var can_fall := true
- func _physics_process(delta: float) -> void:
- velocity.x = move_toward(velocity.x, 0, 20)
- match current_state:
- States.IDLE:
- handle_idle(delta)
- States.FALLING:
- handle_falling(delta)
- States.RISING:
- handle_rising(delta)
- _:
- pass
- move_and_slide()
- func handle_idle(delta: float) -> void:
- var target_player = get_tree().get_first_node_in_group("Players")
- var x_distance = abs(target_player.global_position.x - global_position.x)
- velocity = Vector2.ZERO
- if x_distance < 24 and can_fall:
- can_fall = false
- current_state = States.FALLING
- $TrackJoint.detach()
- elif x_distance < 48:
- %Sprite.play("Look")
- else:
- %Sprite.play("Idle")
- func handle_falling(delta: float) -> void:
- %Sprite.play("Fall")
- velocity.y += (15 / delta) * delta
- velocity.y = clamp(velocity.y, -INF, Global.entity_max_fall_speed)
- handle_block_breaking()
- if is_on_floor():
- land()
- func handle_block_breaking() -> void:
- for i in %BlockBreakingHitbox.get_overlapping_bodies():
- if i is Block and i.get("destructable") == true:
- i.destroy()
- func land() -> void:
- AudioManager.play_sfx("cannon", global_position)
- current_state = States.LANDED
- await get_tree().create_timer(1, false).timeout
- current_state = States.RISING
- func handle_rising(delta: float) -> void:
- velocity.y = -50
- %Sprite.play("Idle")
- if global_position.y <= starting_y:
- global_position.y = starting_y
- if global_position.y <= starting_y or is_on_ceiling():
- current_state = States.IDLE
- await get_tree().create_timer(0.5, false).timeout
- can_fall = true
|