class_name EntityMovement extends Node enum MovementType { PLAYER_INPUT, STILL, NPC_RANDOM_LOOK }; @export var characterBody:CharacterBody3D = null; @export var entity:Entity = null; @export var entityDirection:EntityDirection = null; @export var speed:float = 200; @export var runSpeed:float = 400; @export var friction:float = 8.5; @export var gravity:float = 30; @export var movementType:MovementType = MovementType.STILL; @export var randomLookMinTime:float = 1.5; @export var randomLookMaxTime:float = 4.0; var randomLookTimer:float = 0.0; func _physics_process(delta:float) -> void: if !entity || entity.isPaused() || !characterBody: return; # Update movement _updateVelocity(delta) # Gravity and friction if !characterBody.is_on_floor(): characterBody.velocity.y -= gravity * delta; else: characterBody.velocity += -(characterBody.velocity * friction * delta); # if velocity.length() != 0: # _updateTileData(); # Update character controller. characterBody.move_and_slide(); func _updateVelocity(delta:float): match movementType: MovementType.PLAYER_INPUT: _updatePlayerInput(delta); MovementType.STILL: _updateStill(delta); MovementType.NPC_RANDOM_LOOK: _updateNPCRandomLook(delta); func _updatePlayerInput(delta:float) -> void: var dir:Vector2 = Input.get_vector("left", "right", "up", "down"); var moveSpeed:float; if Input.is_action_pressed("run"): moveSpeed = runSpeed; else: moveSpeed = speed; if dir.x != 0 or dir.y != 0: characterBody.velocity.x = dir.x * moveSpeed * delta; characterBody.velocity.z = dir.y * moveSpeed * delta; if entityDirection: entityDirection.updateDirectionFromMovement(dir); func _updateStill(delta:float): pass func _updateNPCRandomLook(delta:float): if !entityDirection: return randomLookTimer -= delta; if randomLookTimer <= 0: randomLookTimer = randf_range(randomLookMinTime, randomLookMaxTime); entityDirection.direction = randi_range(0, 3);