Thank you for playing.
The level is mostly procedurally generated (enemy placement, enemy types, amount, health, money dropped). The level borders I made by hand, just a bunch of white Line2D nodes :D. Then I stored the nodes in an array to iterate through.
In code, I used the coordinates from line2d.points to create a cutout PolygonShape2D (with polygon subtraction) for the collision. So in the end, creating a new level was basically just drawing a Line2D polygon and adding it to the array.
Level 45 is completely done by hand because I wanted a performance check at the end, with lots of spawns and a 99 HP shape. It's definitely worth trying out if you skipped everything else, just make sure to get some damage upgrades. It's the best level in my opinion but also the laggiest :D
Your idea with the projectile path is actually genius. That didn't even come to mind when I was deep in chaos during the dev phase.