Sounds like you're on the right track with dividing movement into patterns! For the elliptical movement issue (Pattern A), the sudden position jumps are likely happening because you're setting the angle directly instead of incrementing it over time.
var angle = 0.0
var speed = 1.0
var center = Vector2(400, 300)
var radius = Vector2(100, 60)
func _process(delta):
angle += speed * delta
var offset = Vector2(cos(angle), sin(angle)) * radius
position = center + offset
This way, the movement flows naturally along the ellipse. Avoid resetting or hard-setting the angle unless you’re doing a controlled transition.
Also, using a state machine setup (like switching between Pattern A, B, and C based on distance or timers) makes things way easier to manage. Keep going — this kind of structured movement takes a bit to get right but pays off!