(warning: contains some flashing lights)
(Fake08 support added)
SUMMARY
Survive 50 micro bullet-hell levels set over more than a dozen environments to face the final boss.
CONTROLS

Player 1: Arrow keys to move, hold Z,X,C,V,N, or M to slow your ship down for maximum control
Player 2: ESDF to move and Q,TAB,SHIFT, or A to slow.
Pressing Q/TAB/SHIFT/A at any time will enable player 2 to join at the start of the next level.
GAME MODES
Standard: Survive each of the 50 ten-second levels. If anything hits your cockpit you'll need to restart.
Invincible: Experience the game without having to restart. See how few times you can get hit.

Pressing Right on the main menu will take you to a level select screen. Every level is unlocked from the start to make it easier to resume a game, or skip past any difficult levels.
Pressing Down on the level select screen will change game modes.
Pressing Left on any menu screen will turn off background music.
If you complete the game playing all the levels in order then your total number of restarts will be recorded on the cartridge as a high score (single/two player and each game mode count as separate high scores). High scores can be reset in the cart menu.
STORY
THANKS
Huge thanks to Krystman from Lazy Devs Academy for his excellent tutorial series that were instrumental in getting me through this game.
Also big thanks to: SlainteES, Heracleum, SmellyFishstiks, FReDs72, Thelxinoe5, and everyone on the Pico-8 Help Discord.
And thanks to my son Matthew for his invaluable playtesting and encouragement.
DESIGN NOTES


Hello,
I'm been trying to play around with raycasting and I hit lots of problems with the maths so tried copying some code from cast.p8. it kinda works but I'm clearly making some silly mistake when I try to render the image to screen. I'm taking the length of each ray (from left to right, one for each x-axis column), and calculating the height of the wall it hits by just dividing an arbitrary number by the ray length.
Then for each column I'm drawing a line which has the y-value being half the height of the screen + and - half the height of the wall.
In my head this makes sense, but when I render it out the walls look fine, but I'm getting tons of noise above and below the walls.
Does anyone have any idea what I'm doing wrong?
--draw walls
wallH = (1500) / tdist --set the wall height by distance, smaller the distance the bigger the wall
if(wallH > 127) then wallH = 127 end --cap the wall height
line(sx, 64-wallH/2, sx, 64+wallH/2) --sx is the x-coordinate