Toy Box Jam 2020
For the past two years, Deus Ex voice actor/id Software co-founder Tom Hall has put together a game jam for the Pico‑8 fantasy console entitled 'Toy Box Jam'. Entrants are given the same music, art and sound effects and then have two weeks to see what games they can come up with using only those assets.
I decided to give it a shot and the result was Picomen. It's sort of a stripped-down Pokemon parody that... maybe doesn't crash? You can play it online right now!
What follows is a little glimpse into the process behind creating this truly mediocre title.
Finalized Within the Week
OK, so right off the bat I massively sailed over the original deadline. Having little experience with Pico‑8 beyond a micro-game I made in six hours called Fever Dream, the first week of the jam was a crash course in exactly how little I knew.
I hammered out a series of tech demos, trying to quickly drag myself up to competency. Without any clear concept or direction, the result was a random assortment of 'things video games have'. As I started getting to grips with how Pico‑8 arranged graphics and managed colour I struck upon an idea that would both save and doom my entry: Mallet
Mallet is the solution to two problems: that I could only use the assets provided, and that creating visual content for Pico‑8 would require some sort of tool software. Mallet, short for "Sprite Masher & Palette Swapper", can position, scale and re-colour sprites and then save the result into a compact list.
This turned out to be a really fun way to collage all sorts of weird characters and, later on, I realised I could use the same approach to create groovy silhouette backgrounds. I ended up using Mallet to paint the layers of the parallax city-scape that makes up the main setting of the game.
Making this tool and reusing it was what I will tentatively describe as a good idea it meant I could render all my graphics with one chunk of code and kept any bugs contained in one place. What wasn't a good idea was the thought that followed next...
"I can make Pokemon"
Politics, Bureaucracy, Mismanagement
The above screenshot, demonstrating how the combat system in the game works, was taken on January 4th 2021 - one day after the game jam deadline. Judging by the Git diffs from that second week I hauled an enourmous amount of ass to reach even that point.
Getting the game to swap between accepting input and freewheeling the animations took days to work out. The user interface needed to update in sync with the effects, not when the data actually changed, so I had to write a system for time-delaying functions. The code for the battle rules is enormous. Attacks can execute arbitrary functions in an order determined by which side has priority and every character has a passive ability that executes in different contexts depending on whether or not that character is on screen. The rules themselves are complicated, not intuitive and have so many edge cases and oversights that in the final game I had to add a huge pop-up explaining exactly what was happening each turn.
battle.p8 (the file that contains all the logic, input coordination and animation rendering for the battle scenes) was 2448 tokens long by the time I missed the deadline. As a point of comparison, the same file in the finished game is 2265 tokens long. I actually took stuff out!
In my defence, it's easy to see how things went wrong. I mean everyone knows making a turned based game is easier than real time game, right?
The worst part by far is that the battle system was the entire game. You ran the file and it dumped you into a default battle with the handful of characters I'd written data for. When the battle ended the game would screen wipe to black and reset.
So I'd bitten off more than I could chew... obviously. For my second ever Pico‑8 game, a fully realised turned based RPG in a week? Nonsense. But it turns out I wasn't the only one...
Of the 163 entrants to the game jam only 17 had actually submitted games. Game jams often have a high drop-out rate but even for the shit-show that was December 2020 this was extreme. Perhaps sensing his game jam was dying on its arse, Tom Hall extended the deadline with a cheery 'see you at the finish!'.
The month-long extension saw 5 more entries.
Examine What You Are Doing
Having earned a gallows pardon and determined to actually complete a game jam for once, I set out a plan of attack.
Working backwards from what I already had, the battles would need a selection screen to pick out your team. Backwards from that, the selection screen would need some sort of overworld to pick fights in and deliver story text. Backwards from that, there would need to be a title screen and a bunch of scaffolding holding the whole thing together. Each scene had a clear, single purpose and would be completely self‑contained.
Surely this would take no time at all...
Amazingly, it did!
A (much lazier) week later the selection screen was completed, followed by the overworld a week after that - both making use of recycled battle effects and Mallet code. Adding in the title screen gave me an opporunity to think about save functionality and music, and I took some time to learn how Pico‑8's fictional memory system works.
I went back to the battle code and added some new UI elements and effects to make the fights easier to understand and one week from the deadline I was ready to start filling out the data for the game proper. I'd even written an in-game tutorial!
A Prototype for a Much Larger System
Splitting the project into smaller chunks had got the game built fast but resulted in some very sloppy programming. Common code was repeated in multiple places, data was stored in complicated nested tables and the newly created story text was eating up a huge amount of space.
I had planned dozens of characters, each with unique abilities, and right now I was struggling to fit in the test data. It was time for surgery.
First thing to go was the tutorial, no point in teaching people to play a game that doesn't exist. Second, the scope of the game would have to be drastically reduced. I resigned myself to the fact that I'd (once again) been overly ambitious and settled on a vertical slice of the game - one quest line, 5 dialogues, 8 battles. Finally, I spun out any repeated code into new global functions; an effective, if ugly way of earning back hundreds of tokens.
It still wasn't enough. I'd spend hours earning tokens back only to immediately spend them adding one new attack! So, falling back on my default panic behaviour, I started writing a tool.
Pico‑8 organizes all its binary data into hexademical strings. The sprite sheets, the map data, the music - all just one-byte numbers. Pico‑8 also reserves 4096 bytes of space for the map. The map I was not using.
What followed was a massacre. I'd excise any data in the cart that I thought could be crammed into the map, write a really shitty converter for it and see how many tokens I'd saved. Characters? In the map. Quests? In the map. The city background is only 600 bytes, get it in the map!
I had written almost 2000 tokens worth of code in one file to save half that number in another, but I was still spending them too quickly.
Leaping from one deranged technocratic solution to another, I decided that rather than wastefully adding all the attacks in the game by hand I would procedurally generate all the attacks in the game using closures. Every possible attack in the game. All 622 of them.
That the author decided, two days from the second deadline, to teach himself how closures work should come as no surprise to the reader. I flatter myself to think, the fact this ridiculous gamble paid off was also no suprise.
Stay Away from the Press
In spite of it all, it was still a mad dash to the finish. The hours running up to the deadline were filled with coffee, auditory hallucinations, balance tweaks and desperate attempts to make the game feel "less shit".
I'd say the resuts were... adequate.
With thirty-three seconds left on the clock, I submitted what I will charitably term 'a demo'. A game that could be played from beginning to end, that showcased all features I was most proud of and that was verging on fun to play. It wasn't all there, but it was there.
More importantly, the radical changes I'd made to the structure of the code had actually left me way under budget. In the week after the jam I worked on returning the cut content back into the game. This proper version (2.0.0) has branching quests, 37 enemies, 16 exciting special effects and generally makes a convincing case for being an actual video game.
The problem is no fucker seems to have played it.
I made mention earlier of the fact that the Toy Box Jam community was a ghost town but I didn't appreciate it until I tried to promote the game. The big peak on the left is 34 views, plummeting to 10 the day after. The little spike a week later was for the release of the completed version. 10 more views for that. There have been 40 tweets on the #toyboxjam Twitter tag since the extension; from just four people...
A third of them come from me.
In a way it's fitting, this half-baked bumble fuck of a project shambling over the finish line to no fanfare, but it's also sad. I made a gargantuan number of mistakes but I learned from every single one, and whilst my third Pico‑8 game will also be half-finished and late, it will also be better for having done Toy Box Jam.
The lack of interest in the game speaks to the lack of interest in the jam, and in Pico-8 in general, which is a shame because Pico-8 is great! If the last 2000 words have taught us anything it's that game jams like this are a great way dive in to making games at the deep end.
That, and that you should go in like the U.S. Marshalls.