Making a game on a custom bytecode VM in 7 days and 3kB
laurent.le-brun.euIt's incredibly satisfying to see the polar opposite of the usual LLM/superDB/K8/CICD/Cloud/Container/Crapola corpobloat we hear about on this site all the time, namely a tiny piece of handcrafted code, ironically produce something infinitely more aesthetically beautiful, and intellectually interesting from an almost artisan engineering perspective.
Especially because some framework slopper using all the LLM's and bloat in the world could never even imagine reaching this level of productivity. In 7 (SEVEN) days this coder
- Designed a language.
- Implemented a compiler to compile it to bytecode, using F#.
- Wrote a bytecode interpreter, using C++.
- Created a shoot’em up game, using the custom language.
- Renderd the graphics, using a single GLSL shader.
While I agree with the sentiment that LLM coding can produce a lot of inefficient junk code which works with holes if you're lucky...
What you're describing is 7 days of productivity supported by probably 7+ years (or 27+ years) of experience and learning and getting things wrong and restarting over again.
It is definitely wonderful to see though.
I gave Claude a screenshot of your comment, and it accepted the challenge.
Claude called the language Blitz.
The repo it created: https://github.com/fragmede/blitz
Is the code shit? I haven't looked at it. Didn't have to. Probably is. I fed it the blog post at the end, and difference.md has a comparison on what Laurent Le Brun built vs Claude, and Claude is fully aware that it went a different way on a number of different things.
It chose python, I had to tell it to use uv.
I'm on a mac with high DPI and it got confused about that.
I had to tell it to make a binary format (it made a BLTZ header)
But you can clone that repo, do uv run main.py --compile game/shooter.blitz and it'll make a .blitzc. Then you can do uv run main.py game/shooter.blitzc Tear the code apart. Call out every tiny mistake in that repo. It's probably cheating somewhere! But all I did was give it challenge.png that's in the repo, and tiny bits of English, and Claude went to work.
It's been 21 years since my college computer graphics class and I went into distributed systems and not game dev, so someone else will have to tell me if it used a single (or even any!) GLSL shaders, or not.
Call it slop all you want, but that took me 70 minutes of babysitting.
The rest of the games submitted to this very interesting, somewhat niche game jam (including my own entry) are here:
https://itch.io/jam/langjamgamejam/entries
There were some really impressive submissions in spite of the short time frame!
The jam was originally going to be just me doing a solo project but it grew much larger! Over 200 people joined the Discord.
We plan on running it again: https://langjamgamejam.com/
Maybe I missed it, but I didn't notice a submission of yours in the jam. Did you end up getting around to doing your solo project?
Dungeon-Specific Language (DSL)
Cheff kiss!
Reminds me of https://js13kgames.com/ where people managed to do a whole air sim in 13kb (out of many other things)
Such a beautiful technique for shoehorning straight out of the 1970s! See also
https://en.wikipedia.org/wiki/CHIP-8
and
https://en.wikipedia.org/wiki/SWEET16
It seems so un-FORTRAN that DEC had a FORTRAN compiler for the PDP-11. that was based on a stack machine and then later built an FP accelerator specialized to accelerate the stack machine. It was a straggler but I'm still trying to track down a circa 1992 article from Dr. Dobb's Journal where someone used virtual machine techniques to unbreak the broken i860 and make a good FORTRAN compiler.
What's that overall filter that covers the view? Is it supposed to look like a late 80s passive matrix color LCD screen?
Edit: Thanks for the downvote, guess I shouldn't have paid any attention to this post at all?
Worth noting that it's easy (and probably fairly frequent) to click the wrong arrow, especially on a phone screen. I've started double-checking the "unvote" vs "undown" link that appears afterwards to make sure I hit the right one.
So that's how you tell, salutes. Sometimes I worry that I inadvertently downvoted someone by mistake. "But you can just unvote if that happens" sure but how do you tell what was voted.
Anyhow, I think if this was my forum I would put the downvote selector at the end of the comment title and have the upvote selector at the beginning.
There's no specific filter. The main effect is blending the previous frame with the current frame. When blending, I modify the coordinates and add some noise. This makes the graphics look less basic and it creates this noisy trail when things move.
The source code is here: https://github.com/laurentlb/shmup8/blob/main/src/shaders/sc...
Blending is on lines 241, 242.
I didn't try to get a specific 80s look, I just played with formulas.