I love pico 8! (post-release devlog and thoughts)


I had “Make a game” on my new years bingo this year. Didn’t think it’d take me till November to cross that off, but better now than never!

As usual, whenever I’m in a creative rut, Pico 8 always saves the day. Its restrictions are really the only thing keeping me from sinking a year into a project. I have no idea how I had the discipline to release small games in the past outside of gamejams.

This game took me 52 hours of development time, spread out over roughly 2 months. This is the longest I’ve spent on a PICO 8 project (it’s roughly 2x the time I spent on Olden Peak, and more than Olden Peak and PUTRID S4NDS combined).

Small games never burn me out. I always feel so energized after finishing a small project.

This game, more than any other game I’ve worked on in a long time, really showed me the beauty of restrictions. It reminded me of the beauty in making something truly small.

A little mockup I did early in the project

A little mockup I did early in the project

The cutting room floor

I had quite a few things planned for this game that didn’t make it:

  • Regular enemy encounters (this originally wasn’t going to be a boss rush)
  • Special environmental “machines” that created hazards in the overworld (kind of like “elite” enemies)
  • A stat upgrade system
  • An EXP/Leveling system (similar to Olden Peak)
  • A hard mode with enhanced attack patterns

But thanks to PICO 8, all of these things got cut and the game is significantly better without them.

An alternate art style I was considering

An alternate art style I was considering

The planning process

Thanks to PICO 8’s restrictions, I tend to develop my pico 8 projects in order of must-have to nice-to-have.

So after coding up and animating the character controller (minus the shooting), I immediately started working on each boss. Remember: This wasn’t originally meant to be a boss rush, just a game that also had bosses. But I knew where the high points would be, so I started with them.

All three bosses were all done within the first 3 weeks or so of development. At this point, I was at around ~7000/8192 tokens.

From here, I had a pool of features and moments I wanted to incorporate, and only a fixed amount of space left in the engine. I decided to prioritize combat depth first, so I added the shooting and healing mechanics. Then I prioritized story, and added the little dialogue encounters, the final boss cutscene, and the ending cutscene.

And after that, PICO 8 said: “This is big enough, aren’t you tired?” and why yes, I was tired. Thank you PICO 8 for saving me from spending a year making Hyper-light-drifter-but-worse!

Side note: The music planning process

Since PICO 8 only gives you 64 patterns for both music and sound, I also plan the music far ahead of time on paper. I write down all of the melodies and chords I need + how many patterns I’ll need for each bar of music + where I can re-use patterns, and then try to budget out the entire soundtrack. Then, I spend the remaining patterns on sound effects.

These restrictions naturally give rise to really motif-driven compositions. You only have a handful of patterns, so you might as well re-use them.

music editor

Advanced Token Saving

Throughout development, I did various “Token Saving” passes on the entire game’s codebase.

I used the links in this reddit post a ton. The specific biggest token save I implemented was:

Stringifying inputs to functions using unpack(split(…))

For example, my “Particle burst” function signature used to look like this:

function particle_burst(x,y,num,minspd,maxspd,df,r,rf,c,lt)

but this change saved literally hundreds of tokens:

function particle_burst(x,y,args)
    local num,minspd,maxspd,df,r,rf,c,lt = unpack(split(args))

Because now every single call site uses a single string (1 token!) instead of a list of arguments:

Before:

particle_burst(boss.x, boss.y, 10, 5, 7, 0.8, 3, 0.9, 8, 30)

After:

particle_burst(boss.x, boss.y, "10, 5, 7, 0.8, 3, 0.9, 8, 30")

The second one saves ~8 tokens per call.

(The idea came from this post specifically)

If you look at the source code, there’s a function called “deal” which handles this for assigning properties to tables. That also works the same way: Stringifying many inputs delimited by commas. I did this everywhere I could, in addition to regular refactorings, to save hundreds of clutch tokens at the end of development.

Without the above, I don’t think I would have had space for the dialogue system + cutscenes.

NPCs are indexed based on X position

(NPCs are just the objects in the world that show dialogue)

This was just a cool thing I came up with: Each NPC is represented as an index into a big table of dialogue:

npc_lines = {
    [20] = "insects form a community\nbeneath the noble mushrooms.",
    [28] = "a large flower bathes in the\nthin sunbeams of the fissure.",
    [36] = "noble mushrooms sprout\ntogether, always connected.",
    [60] = "somehow in this dark cave\na small sapling has sprouted.",
    -- ETC
}

Normally for world-entities, I’d have a separate sprite for each entity and use that sprite to index into a table. However, I didn’t have the spritesheet space for this, so instead I used a single sprite and used its map X position to determine what the NPC would say.

This saved a bunch of tokens and spritesheet space, at the cost of restricting where I could place NPCs. You might notice that no NPC is in the same screen X position for this reason (except for 2: the “flowers are torn up here” and the “golden flowers bloom in sunlight” NPCs).

The beauty of small things

I really love this post by Farawaytimes about small games. I’ll probably write about this in a separate post, but I really need to keep reminding myself that small games can be really meaningful.

Games that not only respect the player’s time, but also the developer’s time, are games I think I need more of in my life.

I’ve been consuming lots of “small things”, like short stories, short games, etc. Every time I’m reminded how nice it is to have a complete experience in such a small container.

Being kind to my ‘creative self’

I’d been working on The Last Astronomer for most of this past year, but I’m kind of at a dead end with that project. I’ve felt really uncreative and unmotivated because of it. FISSURE BLADE helped me feel creative again.

I always have to re-learn how good it feels to work on small projects. I think I need to put The Last Astronomer on hold indefinitely so I can just make a bunch of small games. It’s so much more creatively fulfilling than slogging away for a year on a project that I’m no longer interested in.

Making small things feels so much more sustainable for me. It feels so much kinder to my creative self.

Fissures

I often make unreasonable demands of myself. Every mistake, every anxiety, every piece of me that I dislike, feels like something I need to erase. But if I pause, sometimes I realize that beauty has bloomed from within these cracks and scars. Indeed, life always returns to these fissures.

Thanks for listening,

Abhi

Get FISSURE BLADE

Leave a comment

Log in with itch.io to leave a comment.