The collision and pathing doesn't use any libraries and is deceptively simple once you start to analyse it. I'd love to add more "juicy" stuff but atm I'm trying to add some finishing touches to another game I've been working on. I still haven't wraped my head around shaders but I'd love to add some bloom later down the line.
I just wound up kiting a literal bunch of enemies all the time, it's not very fun. The boss would hug you and then you take damage and eventually die, I had 4 speed upgrades and it still wasn't fast enough to get away from it. Getting upgrades at random kinda ruins it a bit, like you want specific upgrade path to match your playstyle but instead you get upgrades that you don't even want, making it a waste. I guess you could randomly put upgrades from specific categories, like a random defensive, offensive and manoeuvrable upgrade, so if you don't get exactly right one, you still get useful one.
I've always found kiting to be oddly mesmerizing, if you've ever played this old fps called painkiller you might know what I mean. Altough admittedly it's not for everyone.
As for the boss, well... I tried to sneak in some dynamic difficulty to avoid having it be way too easy or way too hard. The boss will always be a bit faster than the player when the player is moving in a straight line and a bit slower than the player when the player moves diagonally. It's not exactly a brilliant solution.
The upgrade system is somewhat inspired by rougelike/light games in the sense that you'll have to make the best out of a bad situation from time to time. It also forces you to pick upgrade combinations that you'd normally avoid for the first couple of runs. Characters like the gambler or the smuggler are on the other hand better suited for focused playthroughs. Sadly I never implemented a safetynet so it's entirely possible to get 5 extend border upgrades and no firerate upgrades in a row.
I appreciate your crituqe and hope this helped explain some of the decisions I made when making this game.