Stellar Scrapm'n is hauling on the Playdate

Last weekend, I joined forces with my buddy Hunter to make a game for PlayJam 8, a game jam for the adorable yellow Playdate game console.

Introducing: Stellar Scrapm'n! Descend into debt as you ascend to the stars in a clunky little hauling ship. Crank to steer through rocky caverns in search of valuable junk you can sell to pay off a little bit of that financial liability at a time. Also: robots will shoot at you, pew pew, watch out!

Graphic design is my passion.

If you're so inclined, we'd be grateful if you checked it out! You can check out our jam entry to download, rate, and review.

If you have a Playdate, you can sideload the game. If you don't have a Playdate, you can still check it out by grabbing the Playdate dev kit and using the Playdate Simulator!

The review period is open until September 22nd. Check out the other submissions, too! There's slightly more than a dozen little games to check out.

Thanks for reading. You may also enjoy Hunter's post about the game / jam. Feel free to eject at this point because what comes next is-

Something like a dev log

A skippable cutscene for context

Hunter and I are both computer science boys with web business jobs. We don't write much code that looks like game code day to day, but we do enjoy dabbling in "the game dev". Hunter has done some pretty impressive projects in Unity in the past, I enjoy working through Godot tutorial content to keep up with that community, and we are both drawn to the rinky-dink little Playdate console with its retro-aesthetics, thoughtful constraints, and inviting dev tools and documentation.

Before we knew about Playjam, Hunter had been building up a Metroidvania game, inspired by working through SquidGod's YouTube tutorials for working with the Playdate. I recognized a lot of the fundamentals from working through a similar Godot course from Heart Gamedev. Neither of us had done a lot with Lua, but the Playdate API and docs offer a lot of structure for folks coming in with experience working with other languages.

When PlayJam 8 came across our radar, it seemed like the perfect opportunity to work on something together, sharpen our skills, and have fun making a thing. So, we cleared our calendars and set our expectations for success. How hard could it be? (This is foreshadowing.)

It starts with a theme

PlayJam8 kicked off on Friday with the announcement of the theme: ascending. Hunter and I (along with my producer, Amy) brainstormed a lot of potential concepts. Being nerds, we thought a lot about space and our nostalgia for retro games about space.

This is when Hunter introduced me to Space Shuttle Project for the Nintendo Entertainment System.

We did not make a "shot for shot remake" of Space Shuttle Project. You are free to imagine what it would be like!

We were more interested in making a game where you are in space, rather than getting to space. Unfortunately once one is in space, the concept of "ascending" becomes murky as references like "up" and "down" become negotiable. Another thing that is negotiable is money and getting to space is expensive. Hunter was reminded of Hardspace: Shipbreaker where, good news, you've got a cool space job but, oh no bad news, you're in crippling debt and the exchange rate for your hard labor will not fix that. Maybe you can ascend to financial freedom??

This sounded like a fun kernel of an idea, but of course we needed something simpler to implement. I was reminded of one of my favorite childhood games, Solar Jetman: Hunt for the Golden Warpship. This old ad for the game, in my opinion, does not explain the gameplay very well, but the vibes are incredible:

A vaguely game-shaped collection of mechanics

Based on our inspirations, we planned more-or-less these features:

  • A little ship that can navigate by rotating 360 degrees and using a thruster. "Space-like" in that there is no drag - objects in motion stay in motion.
  • Navigating cavernous rocky spaces which can damage you if you bump into them.
  • Goodies to pick up and carry.
  • A base where you can drop off goodies for points / money / upgrades.
  • Obstacles and enemies to interfere with your fetching.
  • Weapons to destroy obstacles and enemies.
  • Multiple levels to progress through as you strip each environment of resources.
  • Interstitials for story.

Friggin' tools

Here are some things that we used:

Struggles

We had a lot of quick wins early on, but stubbed our toes many times. I'm tired, so this won't be hour-by-hour or day-by-day. Feel free to skip this unless you are future me (or Hunter)!

A recurring theme for me personally: I often knew the concepts for what I wanted to accomplish but had little or no practice directly with the tools, like LDtk and Aseprite. Climbing multiple learning curves during a crunch is stressful!

It's a little tricky to get curvy "cavernous" shapes with 2D tilemaps, but it's not too bad. What is bad is the feeling you get when the Playdate's native "axis-aligned rectangles only" physics system goes haywire every time your ship touches terrain. We reined in a lot of the chaos, but there are still plenty of places where a wall tile's bounding box doesn't line up with the actual pixels, making it look like your ship has suddenly stopped for no reason, or like you're embedded in the rock.

I went down a lot of rabbit holes for the physics issues, including evaluating alternate physics engines (which usually require building C extensions and wholly separate level-creation tooling) and adding a layer to take over to see if there was "really" a collision when the Playdate says there was. We simply ran out of time on this.

The other major toe-stubber was our choice to bring in, but not commit to, the Noble Engine.

The built-in concepts of Scenes that you can move between, with Noble taking care of transitions and lifecycle management, sounded like a great way to separate out concerns. Our focus started on the GameScene, which holds the level and player and enemies and collectibles and- you know, gameplay.

Unfortunately, we did not test our understanding of how Noble manages multiple scenes until very late. It turned out we were making sprites that Noble could not clean up on transition, loading things before Noble was ready, expecting things to be cached that Noble was throwing away, and more. A mess!

After finding this out so late, my instinct was to cut our losses and drop features like a title screen and different levels, which would have let us focus on building the game as if Noble's scene management stuff wasn't there. Unfortunately, I ignored that instinct and spent a lot of time moving code around, chasing down references, touching many parts of the project, breaking-and-fixing, finally getting things barely-working. The result is that we got our title screen, but we didn't have time to add any actual interstitials or extra levels. So... the menu basically serves no purpose, haha! Bonus: I accidentally left in a debug option in the player controls so you can bounce yourself to the title screen and back again and resume with everything exactly where you left it. And by "exactly where you left it" I mean it reveals some object cleanup bugs that we missed, as all enemies, collectibles, and even fired bullets suddenly return from the void! 😂

This was a triumph

I tend to focus on the negative, but this whole thing was pretty fun and we learned a lot! To ask "what would I do differently?" would be foolish - time only moves in one direction - I am grateful for the experiences and will carry this learning into the future.

Hunter and I both want to keep filling in the holes in the project, and (eventually) release something that feels like a complete game experience. I think that rules!

I look forward to becoming more fluent with the tools that were new to me! Theory is not the same as practice, and I could use more practice. Particularly the meta-practice of doing things that I am not already "good" at. Practice at being bad at something and struggling to get better.

Hell yeah!