Introduction:
In recent years, fantasy console tiny intros on platforms like TIC-80, PICO-8 and MicroW8 have really come a long way, sometimes even challenging the DOS supremacy that has dominated the 'highend' tiny intro scene for years. However the smaller the size, the harder it becomes to write a good tiny intro.
Development:
When checking the Fantasy Console entries on Nanogems we can quickly see that while there are still a few okay-ish 128 byters available for Fantasy Consoles, for the most part DOS (and to some degree ARM thumb) entries are still at an advantage, with the 64 byte and below categories clearly dominated by other platforms. So I set myself the challenge to make a fantasy console intro in 64 bytes to at least challenge their DOS counterparts a little bit, and the result was Yonaguni.
As doing traditional raycasting to do the sirpinski's would be kind of challenging for the size, i opted for straight up per-dot projection instead. Which ment you'd need a clearscreen command, but you'll save a little bit on the implementation using just a single setPixel function. Most of the heavy lifting is done by using something like this oneliner for calculation and projecting just an Y-coordinate for each x-position:
y = ((x * z / 320 ^ z) + time) % 320;
plotPixel(x, y * 320 / z, color);
But even with this simple approach, the intro quickly went over budget. From here it was an optimisation process that included using only two integer constants (19
and 320
), reading the timer directly from 0!64
and being able to juggle 2 iterated loopcounters into a single line of voodoo magic like this:
branch_if z := (z - !(x := (x + 19) % 320)): dots;
Which will pseudo randomly hop the x-coordinate around with horizontal resolution and when it hits 0, it will decrease the z-value.
Sourcecode:
Here is the full sourcecode for the intro, bringing it all together:
cls(19);
let x: i32;
let z: i32 = 320;
loop dots {
let inline y = ((x * z / 320 ^ z) + (0!64)/19) % 320;
setPixel(x, y * 320 / z, -z/19);
branch_if z := (z - !(x := (x + 19) % 320)): dots;
};
Conclusion:
Although the intro was finished some time ago, it was waiting for the right party to release, as it needed to compete against productions 4 times its size. A theme, colorscheme and the title Yonagoni (named after the Japanese Island that hosts some impressive underwater structures) were chosen to give everything a cohesive theme.
For more information, you can check out the final intro here