func process_physics(delta: float) -> PlayerState:
    if !sprite_node_position_tween or !sprite_node_position_tween.is_running():
        if Input.is_action_pressed("east") and !parent.ray_cast_east.is_colliding():
            _move_player(Vector2(1, 0))
        elif Input.is_action_pressed("west") and !parent.ray_cast_west.is_colliding():
            _move_player(Vector2(-1, 0))
        elif Input.is_action_pressed("north") and !parent.ray_cast_north.is_colliding():
            _move_player(Vector2(0, -1))
        elif Input.is_action_pressed("south")  and !parent.ray_cast_south.is_colliding():
            _move_player(Vector2(0, 1))
    
    return null

func _move_player(direction: Vector2) -> void:
    parent.global_position += direction * TILE_SIZE
    if sprite_node_position_tween:
        sprite_node_position_tween.kill()
    sprite_node_position_tween = create_tween()
    sprite_node_position_tween.set_process_mode(Tween.TWEEN_PROCESS_PHYSICS)
    sprite_node_position_tween.tween_property(
        parent.animated_sprite, 
        "global_position", 
        parent.global_position, 
        TILE_TRANSITION_SPEED
        ).set_trans(Tween.TRANS_SINE)
    parent.player_moved.emit()