feat: Implement enemy spawning and movement logic in the level manager

This commit is contained in:
2026-03-20 20:40:12 +11:00
parent 00af585cf4
commit 3f2cbcc6f2
4 changed files with 74 additions and 7 deletions
+53
View File
@@ -0,0 +1,53 @@
## enemy.gd
# Enemy character script. Each turn, chases the player one tile using pathfinding.
class_name Enemy
extends Character
# Movement speed in pixels per second.
const SPEED: float = 200.0
# Distance threshold for snapping to a tile (prevents jitter).
const ARRIVAL_THRESHOLD: float = 4.0
# Reference to the player — set by LevelManager after spawning.
var _player: Player
# True while animating toward _move_target.
var _is_moving: bool = false
# World position of the tile this enemy is stepping toward.
var _move_target: Vector2 = Vector2.ZERO
# Called by TurnManager. Pathfinds to the player and steps one tile closer.
func take_turn() -> void:
var my_tile := LevelManager.world_to_tile(position)
var player_tile := LevelManager.world_to_tile(_player.position)
var path := LevelManager.find_path(my_tile, player_tile)
# path[0] is own tile; path[-1] is the player's tile (don't step there).
if path.size() < 2:
turn_finished.emit()
return
# Stop one tile away from the player — don't overlap.
if path.size() == 2:
turn_finished.emit()
return
_move_target = LevelManager.tile_to_world(path[1])
_is_moving = true
# Glides toward _move_target each frame. Emits turn_finished on arrival.
func _physics_process(_delta: float) -> void:
if not _is_moving:
velocity = Vector2.ZERO
move_and_slide()
return
var to_target: Vector2 = _move_target - position
if to_target.length() < ARRIVAL_THRESHOLD:
position = _move_target
velocity = Vector2.ZERO
move_and_slide()
_is_moving = false
turn_finished.emit()
else:
velocity = to_target.normalized() * SPEED
move_and_slide()