Clunky is fine for a prototype

designsystemstools

The first real mission in Space Game was a salvage run, and I built the whole thing by hand. Spawn some cargo here, drop a waypoint there, show a message when the player gets close, mark it done when they haul the scrap back. It was a pile of bespoke wiring held together by hope that I hadn’t forgotten a step. And for a prototype, that was completely fine. It answered the only question that mattered, which was whether the loop was any fun.

The trouble started with the second mission, and then the third. Each one was its own hand-wired tangle, and each one repeated most of the first. When I fixed a bug in how cargo spawned, I had to go fix it again in every mission that spawned cargo. That’s the moment a prototype stops getting to be a prototype. The mechanic worked, but there was no way to build more of it without doing the whole thing by hand, again, every time.

So I stopped building missions and turned the thing I’d built by hand into a system.

The smallest piece is now an event: spawn some cargo, show a message, set a flag, point the player somewhere. Each event does one thing, and it doesn’t know or care what mission it belongs to. Because it doesn’t care, the same “spawn cargo” event runs in a tutorial, a story beat, or a throwaway side contract. I fix the bug once and every mission that used it is fixed.

The ship also keeps a little notebook. When you finish a salvage run an event writes salvage_run.completed into it, and when you abandon one it writes that down too. It’s just a list of things you’ve done, and it’s the list every other mission reads from.

A flag on its own doesn’t do anything. Conditions are what make it matter. Only offer this contract if the first one is done. Only fire this beat once. Hide that option after you’ve picked it. Point a condition at a flag and a mission stops being a straight line and starts to branch.

Now a mission is an arrangement of parts instead of a bespoke tangle. My “advanced” salvage run is nothing more than this: require that the beginner run is done, spawn two crates instead of three, mark yourself complete. No new code, just the same pieces in a different order.

The catch with a lot of small pieces is that they’re a lot of small pieces, and by now that’s more machinery than any single mission needs. That’s the second half of the problem, because a system you can’t see is its own kind of clunky. So I built a graph view right in the editor that traces a mission from its opening choice out through every event, waypoint, and flag it touches. A button connects to the events it fires, and a flag one mission writes lights up as the branch another mission reads. It also warns me when a condition is waiting on a flag that nothing ever sets, which is the typo that used to cost me an afternoon.

None of this made the prototype more fun. The salvage run plays exactly like it did when it was hand-wired. What changed is that I can build the next fifty missions without rewiring each one from scratch, and I can open one up and actually understand it. Clunky is fine while you’re still finding out whether the idea works. Once you know it does, the game needs real tooling, and that’s the part I’m building now.