I’ve spent the last two weeks crunching on a vertical slice milestone, and it’s getting close to being finished. My deadline is Wednesday; Thursday we’ll be headed down to San Antonio for PAX South, and I’ll try to have a playable build ready in time for next week’s update.
The goal of this milestone (besides having a nice build that I can point to and go, “See that? That’s the game I’m making!”) has been to prove that my schedule is viable. I’m aiming for a June release, and in order to complete the game by that time, I’ll need to produce content at this same rate for the next four or five months. Maybe.
I haven’t met all my goals for this milestone, and it’s unlikely I will. I’m happy with how the vertical slice level looks, but I had intended to do more — much more — with environment art and decorations. And I just haven’t had the time to complete everything.
I knew when I was scheduling tasks that there would be a lot of work I hadn’t accounted for. In fact, I’d estimate about half my time these last couple of weeks has been spent on these unscheduled tasks. These included getting saved games working, handling death and game over states, wrangling random number generators to behave correctly in all cases, and various tweaks, polish, and bug fixes too minor and numerous to mention here.
Some of those tasks were one-time-only. Most of them, probably. Saved games work, for example. Barring minor polish or bug fixes, that’s not something I’ll have to touch again before shipping. But I know between now and June, there will be other tasks I haven’t allotted time for, and I can’t guarantee I’ll have any more of an opportunity to work on things like environment art than I’ve had this milestone.
So, considering the triangle of resources, scope, and schedule, what are my options? My resources are fixed. My schedule is pretty much fixed; there might be a little wiggle room in when exactly I launch, but for now, I’m disregarding that. So, scope. Cut scope. Obviously.
Maybe I don’t need as much decorative environment art as I thought. This level is already looking good (and comparatively miles ahead of where Super Win was at any point in its development). So maybe that’s good enough. Another possibility is that I lean harder on content reuse. I’ve been scheduling time for drawing a completely unique tileset for each level, and that might not be necessary. For one thing, I already have a number of tilesets in progress, dating back to nearly a full year ago, when I replaced tiles stolen from Faxanadu with an original set. For another, I suspect I’ll be able to get a lot of mileage out of swapping the palettes of my existing sets. It’s possible that a core set of tiles consisting of common elements like bricks, drawn in a variety of colors and accented with level-specific decorations, might be enough.
I’ll be figuring all this scheduling stuff out as I wrap this vertical slice milestone and move on to the remainder of production. I don’t expect things will slow down at all; I said a couple weeks ago it would be a mad dash to the finish line, and it feels like that’s still going to be the case, but I have some great forward momentum. It’s exciting seeing all the bits and pieces I’ve been working on in isolation for so long finally coalesce into something resembling an actual game.
If it feels like I’ve been leaning hard on that topic in these blogs, that’s only because it’s proportionate to the amount of time and effort I’ve invested in these systems. Serialization in Gunmetal Arcadia is shaping up to be the crowning technical achievement of these games, in the same way the first implementation of the related entity-component system was in You Have to Win the Game and the editor and its XML-powered instantiation of entity components was in Super Win.
Recently, I’ve been tackling saved games in Gunmetal Arcadia Zero. I talked a little bit about the introduction of a three-slot save file system a la Zelda in last week’s video, but I haven’t really dug into how it works under the hood.
Last March (has it really been that long already?), I drew up this possibly-syntactically-accurate UML diagram.
And if you can follow that, it’s still pretty much the state of things. If not, it can be simplified to, “When entities are destroyed, they can write their current state into deltas in memory, and those can in turn be written to disk in turn. And then that whole process can be performed in reverse.” The part I’ve been focusing on recently is that link in the very bottom right, where the serializer meets the disk. In Super Win the Game, and in Gunmetal Arcadia Zero until just recently, this was a trivial process. The serializer would dump its content to a predetermined location on disk or replace its contents wholesale with contents loaded from that same location.
That was good enough for Super Win, but I’ve known for a while I’d need a more versatile solution for Gunmetal Arcadia and its eventual persistent state that exists beyond a single run, so it made sense to broach some of these topics for Zero. I’ve been imagining the interface for Gunmetal Arcadia would mirror The Binding of Isaac‘s three-slot system (which in turn was lifted from Zelda and countless other classic games), but that didn’t necessarily have to be the same for Zero. So I put it to a Twitter poll:
I'm refactoring saved games. What sort of interface do you prefer for an action platformer? (Think NES Castlevania.)
— J. Kyle Pittman (@PirateHearts) December 29, 2015
Aaand I guess I’m doing a three-slot system for Zero, too! That’s convenient. (In fact, I’m also tentatively supporting quicksave, barring any unresolvable issues it might raise.) So I threw together a quick prototype and an interface, and it looks like this.
And then I had to solve all the problems this created.
The first thing to understand was that each of these save slots needs to encompass multiple saves on disk. One of these would be your last checkpointed location, the place you’d respawn on death. Another would be an immediate autosave location for exiting and resuming without losing data. Then there would be a manual quicksave that could be created at any point. These could all coexist without stomping over each other, but they’d all conceptually represent the same session, the same save slot.
So I broke these out into “profiles,” each of which could contain an arbitrary number of “saves.” (In this example, a “profile” is one of the three slots, and a “save” is a single snapshot of the game at any given time.) Zooming in on the corner of my old UML diagram, it would now look something like this:
The implementation is about as straightforward as I can imagine. Each profile maps to a separate folder within a base saves location, each save maps to a separate folder within its respective profile, and inside that folder, I can put whatever data is associated with that save. In practice, this is currently a single file containing all serialized data. I had previously done some work to support saving and loading arbitrary binary data from additional external files, but a recent change to give each entity its own random number generator created too much file bloat as each one wrote a separate file to disk, so I’ve temporarily deprecated that path.
Where this got a little more interesting was in deciding how to handle death and game over states. I was starting with a few assumptions:
- I want a finite number of lives in Gunmetal Arcadia Zero. My concern is that death becomes inconsequential with unlimited retries.
- Running out of lives should not completely reset the game. That would be too punishing and fundamentally at odds with having a saved game.
- The experience of running out of lives needs to be different in some way from the experience of dying once. That is to say, these can’t both simply send you back to the last checkpoint. There has to be something on the line to discourage failure.
This has led me to split the game’s checkpoints into two separate but occasionally overlapping concepts. There’s an initial checkpoint when you first enter a level, and then there may be additional midlevel checkpoints throughout. When you die, you return to the most recent checkpoint you reached, whatever that was. (Besides the start of the level, these will typically also occur immediately after boss fights.) When you run out of lives, you’ll get dumped back to the title screen, but you can choose to continue your game from the beginning of the last level you reached. I’m imagining this case will also incur some further costs, such as losing money or gear, but whatever the price, it won’t be a complete reset.
I’ve been racing to get these features online in time for the vertical slice coming up at the end of next week, and it’s just about there. I’ll still have a few game features left to implement after that, including figuring out how to transition from one level to another after boss fights (or from the final level to an ending sequence and credits), but I’m quickly reaching a point where I can focus almost entirely on content creation.
Hi 2016! Hi regular updates! This week marks my return to full-time development and my former weekly blogging schedule. Thanks for your patience during the interim, and a special thanks to my Patreon backers for standing by as my progress has slowed. I’m back!
I’m currently focused on knocking out the last few remaining core gameplay features I’ll need for Gunmetal Arcadia Zero before I move on to content production for that game in anticipation of an early summer release. I’ll dive into those topics more thoughout the coming weeks, but I wanted to kick off the year with a top to bottom recap of what this thing called Gunmetal Arcadia is that I’ve spent the last fifteen or so months of my life developing.
“Gunmetal Arcadia is an action-platformer roguelike…”
“Gunmetal Arcadia is basically a roguelike Zelda II…”
I don’t know, I’m bad at elevator pitches.
Gunmetal Arcadia looks like this:
…or maybe like this, thanks to my hopefully-someday-to-be-award-winning CRT simulation.
Wait, let’s back up.
In September 2014, as I was nearing completion of Super Win the Game, I began taking notes on what my next game could be. I liked the idea of reusing the tech I had developed for Super Win, and that necessitated — or at least strongly encouraged — making another retro NES-themed game. It felt like a good opportunity to tackle some longstanding goals of mine. I’ve wanted to make a game in the style of Zelda II practically since I first played Zelda II. The idea of melding roguelike elements with other genres is fairly commonplace now, but the idea to randomly generate an unlimited number of Zelda II-like dungeons first came to me somewhere in the vicinity of ten years ago, and it’s been bouncing around my head in some form or another ever since, just waiting to be implemented.
But that history is well-documented. In the context of a post-Super Win world, Gunmetal Arcadia has come to feel like a bit of a redo, a chance to make up for the flaws of my last game, set my sights higher across the board, and produce something for which I don’t have to make excuses.
From the outset, I’ve striven to avoid cutting corners in Gunmetal Arcadia, forcing myself to solve the hard problems that I glossed over in Super Win. That behavior was less a product of laziness than an overly aggressive tendency to cut early, a mentality that arose from its predecessor, ignoring that game’s status as a freeware side project and choosing to remain stubbornly beholden to unnecessary principles. Melee combat would impose a lot of new challenges and draw out the schedule and this game would never ship, so the player won’t have a weapon. Now that’s canon, so I have to respect it in the sequel. Those were the sorts of design decisions that ended up watering Super Win down into “just a platformer” (albeit one with impeccable game feel, but how do you sell that?) and in conjunction with a handful of other regrettable decisions (cough the name cough) damaged its marketability.
By contrast, Gunmetal Arcadia is the project where I ravenously tear into every challenge regardless of perceived challenge, genuinely consider every wouldn’t-it-be-cool-if, and to the best of my ability remain open and honest about the entire development process. And this has produced a host of exciting new features that are going to define the look and feel and function of this game, to wit: melee combat, palette swaps, tools to facilitate faster creation of game entities with more expressive animation, massive improvements to the expressiveness of the audio synthesizer, and much, much more.
I feel like I should emphasize that these are games from scratch. That’s not a term that gets thrown around much in the games industry, but it’s perhaps the most apropos in this case. I build all my own tech: my own game engine, originally developed for Windows and painstakingly ported to Mac and Linux; my own editor, built for Super Win and leveled up for Gunmetal Arcadia; all original code and content, all requiring an engineer’s attention to detail. Nothing comes easy, and nothing comes cheap, but the level of freedom and control this affords me is worth it. The results speak for themselves.
Before looking at the future, I have to dive into the past once more. Last summer, I made the decision to expand the scope of Gunmetal Arcadia to encompass a second game. Gunmetal Arcadia Zero was conceived as a prequel, smaller in scope and without the roguelike trappings of the flagship title, but with a more discernable path to completion and an earlier launch date. As Zero has become my primary focus in the last few months, I’ll continue my recap there and conclude with some discussion of my high-level goals for the second game, the roguelike action-platformer called simply Gunmetal Arcadia.
Gunmetal Arcadia Zero was born of an uncertain schedule, but it has quickly transformed in my mind into something really exciting and really special. I’ve been thinking of Zero in terms of the original NES Castlevania — six levels, each with an end boss, linear and tightly focused. I think it’s fair to say that isn’t necessarily a game that I would have ever chosen as my next project under normal circumstances. It feels like too much of a known entity. It’s — and I say this with tongue planted squarely in cheek — too easy. I tend to favor the experimental concepts, the ones that necessitate the sort of grueling problem solving on which I thrive. Zero offers none of those. But the way it’s grown organically out of the development of the roguelike Gunmetal Arcadia, the way it can serve as a prequel narratively and also as an appetizer functionally, that’s exciting. And by design, it shouldn’t require solving hard problems. The entire point of this game from the very start has been to take the wealth of technology I’ve already built, produce something great with that, and continue building on those successes for the flagship game.
So right now, my life is Zero. I’ll be honest, most of it still exists only in my head right now. Bits and pieces are beginning to appear: a tileset here, a graybox level there, but it’s not a playable game yet. That process begins this week. My goal is to have a vertical slice level ready in time for PAX South. (I won’t be demoing anything there, but I will be attending, and it’s a good place to set a milestone.) That will validate my schedule, which has me shipping in June.
It’s going to be a mad dash to the finish line, and I can’t wait. I’ve been champing at the bit for months waiting to get back to full-time development. There are still lots of aspects of this game that need to be designed and implemented or cut, and I expect I’ll be making hard cuts all the way to the end, but right now, I’m full of adrenaline and ready to make an amazing video game.
Gunmetal Arcadia — and now I’m speaking specifically of the flagship title, the roguelike, the one that doesn’t have a subtitle to disambiguate it from the series as a whole — is the most ambitious project I’ve ever undertaken. Whether it has the opportunity to grow into that ambition depends on many factors, not the least of which are the reception Zero receives and its own continuing interest as a “hobby” game, one that players want to return to day after day. To that end, I’m planning to support daily challenges in the style of Spelunky (and more recently, The Binding of Isaac), and I hope to be able to sustain a rapid cycle of post-release content production.
But I’m getting ahead of myself here.
The structure of a session of Gunmetal Arcadia is going to be similar to the whole of Gunmetal Arcadia Zero. “Six levels, each with an end boss,” or something to that effect. But these levels will be constructed pseudorandomly from prefabs, and you’ll only have one life. If you fail, you start over from the beginning with a different set of levels. But here’s the hook: the decisions you made and the actions you took in your previous session will have immediate and obvious consequences in your next session. In most cases, these will be positive effects, and in that way, I hope to mitigate some of the frustration of permadeath without introducing grinding. This will also necessarily introduce the concept of deliberately making decisions in your current session with the intent to alter the shape of your next session, and perhaps of sessions beyond that. (As per Episode 13 of my YouTube series “Let’s Make Gunmetal Arcadia,” these effects will be formatted as strict action-reaction pairs, but that doesn’t necessarily preclude these reactions from setting up chains of events across multiple future sessions. Whether I take advantage of that fact is still up in the air.)
This structure provides a perfect opportunity to grow Gunmetal Arcadia not only as a singular experience but as a platform for expansion. It’s no secret that The Binding of Isaac has been hugely influential to this project, and in particular, the way it has been expanded over the years serves as a model for Gunmetal Arcadia. In a perfect world, a world in which the base game had the groundswell to support a longterm plan like this, I would continue adding new playable characters, tilesets, prefabs enemies, upgrades, bosses, action-reaction pairs, and more into the foreseeable future. I can’t predict whether it will ever reach that state. To do so, I would need to make a fantastic base game that could compel a majority of players to return on a regular basis, and I would need to market it well enough to reach every potential player. And that’s a tall order. I can’t guarantee I’ll get there. But that’s the dream.
There’s a weird chicken-and-egg problem that comes up from time to time in game development. Simplified, it goes like this:
Developer: “I’m not going to support Feature X because my player base isn’t large enough to justify the cost.”
Consumer: “You’d have a larger player base if you only supported Feature X.”
To feasibly sustain development of new content for a shipped game requires sales to be consistent enough to offset the cost of development at minimum. But I can’t sell the game on the strength of features that might someday exist. Deciding which goals to pursue requires a leap of faith — an educated one, perhaps, but a leap nonetheless.
This ties back into my earlier comment about not cutting corners. The base game alone has to be an experience worth playing — and paying for — in its own right, regardless of any plans for future content. (Gunmetal Arcadia Zero carries a similar weight, being the first game in the series players will have the opportunity to experience.) To that end, whatever cuts I do make need to be extremely discriminating. And I need to hope my efforts towards marketing this game (still a notoriously unsolved problem among indie developers) are more effective than past attempts.
So that’s my goal: make Gunmetal Arcadia an infini-project that I can realistically continue supporting with new content for a long time. We’ll see how it goes. Worst case scenario, I’ll let it be whatever it is and go make that sci-fi horror game I’ve been sitting on for years.
If you’ve read this far, congratulations! You’ve survived what should hopefully be my last overly long and self-serving attempt to recap this game and its development for the foreseeable future (Wednesday’s upcoming video notwithstanding). I promise next week I’ll be back to hardcore development details, so stay tuned!
You can support my efforts to document the development of these games on Patreon.