summaryrefslogtreecommitdiff
path: root/Scenes/Entities/Enemies/Components/Movement.gd
diff options
context:
space:
mode:
Diffstat (limited to 'Scenes/Entities/Enemies/Components/Movement.gd')
-rw-r--r--Scenes/Entities/Enemies/Components/Movement.gd57
1 files changed, 47 insertions, 10 deletions
diff --git a/Scenes/Entities/Enemies/Components/Movement.gd b/Scenes/Entities/Enemies/Components/Movement.gd
index 6ded026..28b374d 100644
--- a/Scenes/Entities/Enemies/Components/Movement.gd
+++ b/Scenes/Entities/Enemies/Components/Movement.gd
@@ -13,10 +13,15 @@ signal direction_changed
const DIRECTIONS = [Vector2.UP, Vector2.RIGHT, Vector2.DOWN, Vector2.LEFT]
var CURRENT_DIRECTION = Vector2.UP
+var LAST_DIRECTION = Vector2.UP
+var was_colliding = false
@export var timer_time: float = 3.0
@onready var MovementTimer: Timer = Timer.new()
+@export var follows: bool = false
+@export_range(1, 100, 1) var follow_chance: int = 100
+
func _ready():
MovementTimer.wait_time = timer_time
@@ -28,35 +33,67 @@ func _ready():
func physics_process(delta):
if CURRENT_DIRECTION == Vector2.UP:
entity.velocity.y -= SPEED
- sprite.play("up")
+ if sprite.sprite_frames.has_animation("up"):
+ sprite.play("up")
elif CURRENT_DIRECTION == Vector2.DOWN:
entity.velocity.y += SPEED
- sprite.play("down")
+ if sprite.sprite_frames.has_animation("down"):
+ sprite.play("down")
elif CURRENT_DIRECTION == Vector2.LEFT:
entity.velocity.x -= SPEED
- sprite.play("left")
+ if sprite.sprite_frames.has_animation("leftup"):
+ sprite.play("left")
elif CURRENT_DIRECTION == Vector2.RIGHT:
entity.velocity.x += SPEED
- sprite.play("right")
+ if sprite.sprite_frames.has_animation("right"):
+ sprite.play("right")
+
+ if sprite.sprite_frames.has_animation("default"):
+ sprite.play("default")
var collision = entity.move_and_collide(entity.velocity * delta)
entity.velocity = entity.velocity.lerp(Vector2(0, 0), 1) # speed too low => no collision
if collision:
+ was_colliding = true
if MovementTimer.time_left > 0:
_on_movement_timer_timeout()
+ else:
+ was_colliding = false
return collision
func _on_movement_timer_timeout():
- var directions = DIRECTIONS.duplicate()
-
- directions.remove_at(directions.find(CURRENT_DIRECTION))
- directions.shuffle()
-
- CURRENT_DIRECTION = directions[0]
+ var randomize_direction = false
+
+ if follows and randi_range(0, 100) <= follow_chance:
+ var player_direction = entity.position.direction_to(Global.player.position)
+ if abs(player_direction.x) >= abs(player_direction.y):
+ if player_direction.x >= 0:
+ CURRENT_DIRECTION = Vector2.RIGHT
+ elif player_direction.x < 0:
+ CURRENT_DIRECTION = Vector2.LEFT
+ elif abs(player_direction.y) > abs(player_direction.x):
+ if player_direction.y >= 0:
+ CURRENT_DIRECTION = Vector2.DOWN
+ elif player_direction.y < 0:
+ CURRENT_DIRECTION = Vector2.UP
+
+ if was_colliding and LAST_DIRECTION == CURRENT_DIRECTION:
+ randomize_direction = true
+ else:
+ randomize_direction = true
+
+ if randomize_direction:
+ var directions = DIRECTIONS.duplicate()
+
+ directions.remove_at(directions.find(CURRENT_DIRECTION))
+ directions.shuffle()
+
+ CURRENT_DIRECTION = directions[0]
emit_signal("direction_changed", CURRENT_DIRECTION)
+ LAST_DIRECTION = CURRENT_DIRECTION
MovementTimer.start()