Artificial Limits: The development of Down

Introduction:

After releasing the first sizecoded PICO-8 intro back in 2021 at a time there wasn't a compressed cartridge format around, I ported over a bunch of our TIC-80 intros, but never properly returned to the platform for newer projects. So I figured after 5 years I would try to do another dedicated intro for the PICO-8 platform as a personal challenge.

Intro Development:

Because the PICO-8 platform is quite limited in terms of performance (using virtual cycles). So using enough romspace and the textured triangle function you can get some cool 3D on the platform, but trying to do proper 3D marching was going to be very hard at decent speeds.

So the way that I approached this challenge is 3 fold:

1. I started by making a scene that kinda looks cool and bended but technically still using fixed-step raycasting rather than actual raymarching. I mask this by doing all kinds of bending and tilting of the general shape into a more tunnel/hanger type of scene.

2. Even though the camera is moving up and down changing perspective, I made sure my scene was perfectly symetrical so I could abuse the mirror register to mirror the right half of the screen, allowing me to only calculate half the pixels.

3. I'm limiting the amount of vertical lines I'm using as well as using a Kind of timed dithering both horizontally and vertically to minimize the actual pixels that I need to calculate.

Combining all of the above makes the impossible on paper just about possible to run the effect at far from full-speed but without it being too jarring.

Once the scene was up and running, I went about setting up the custom palette indices, the fading code for progression and adding some simple interfering sawtooth buzzes for sound to make up the rest of the intro.

So with that said, here is entire code for the intro (formatted a little for better readability):

z=0pal(2,13)pal(3,6)poke(24364,5)cls()
::a::
z+=1 for x=-64+z/2%2,0,2 do for y=z%2-8,80,2 do
c=0 for d=-8,-64,-1 do
h=((d*(x-y/6+9)^^(x/8+y)*d+d*d/2+sin(z/200)*720)/256+5)&d-z
if h&8>0then c=abs(d*sin(z/1600)*1.2/d)*(h%4)break end
end
pset(x+64,y+28,c)end
poke(12933+x,9)sfx(1)end
goto a

Since the intro was more of a personal challenge than a serious production, I didn't have a specific type of release in mind. But when Shadow Party rolled around again I packaged up the intro and submitted it just in time for the deadline.

Conclusion:

Getting the intro to run somewhat performant with a little bit of sound and progression was a nice personal challenge, but I was happy that the party audience was also able to understand the extra challenges involved compared to the other more capable fantasy consoles out there.

For more information, you can check out the intro at Demozoo

Return to blog overview