1. Both. I use:
func _process(_delta: float) -> void:
_visual_position = _visual_position.lerp(global_position, VISUAL_SMOOTH_FACTOR)
sprite.global_position = _visual_position
And for physics I use physics_process. That combination gives really smooth movement visually and catch slightest mouse movement changes at the same time.
2. Glad we're on the same page, really. AI balancing was a semi-manual machine learning and current version of evolving, super-smart npc took me like a one working day, I'm kinda impressed. Took me a whole week to do the same task on other game without some GPT.
3. Thank you once again, I really appreciate your support. I'm dedicated to do more games, so stay tuned! Have a nice time of day you have :D