How I Finally Finished a Game for Ludum Dare 60

Ludum Dare is a game jam, an event where people make a game around a theme in a few days. The name is Latin for “to give a game,” and the first one was held in April 2002 with 18 people. The theme for LD60 was Old Tech.

There are two ways to enter. The Compo is the original format: one person, 48 hours, every asset made during the event, and the source code published with the game. The Jam is 72 hours, allows teams, and is looser about assets. I entered the Jam.

My only goal was to finish something, and I did. Obsolete is a turn-based browser game where you go from a farm to a data center in 20 days. You can play Obsolete in your browser. Looking back, it’s also a good look at what my work is like when there isn’t time for planning and design upfront. Here’s how it came together, from the first idea to the parts I’d do differently.

Old tech, and where the idea came from

I started with a mood board, a collection of images I use to set the direction for a project. Mine had screenshots of early games like Pong, Donkey Kong, and Pac-Man, and photos of old consoles I own.

But tech is more than electronics. A plow is tech, and so is a forge. I wanted a game about how tech changes over time, so I tried to think of one I’d played that showed that progression. The simplest, most concrete example I could find was A Dark Room, a text-based browser game where you start by lighting a fire and slowly build a village. So my plan was to clone it as closely as I could until I felt like changing something.

I’ve never finished A Dark Room, and the way it frames its population as slaves is probably the biggest reason. When I asked Claude about it, it explained that the game is a commentary on colonialism. That’s fine. It’s just not a game I wanted to play. It seemed to tell me what to think about the subject instead of letting me think about it.

Why I didn’t use an engine

I’d been planning to build my own game engine for this jam, but I hadn’t started it yet. So that was out.

Unity was the other option. Its accessibility tools don’t support games built for the web, so making it work with a screen reader would have been extra work on top of everything else. I also haven’t used Unity seriously since 2016. Most of what I knew still works, but I thought it would be faster to write the code than to relearn the editor.

I wrote Obsolete in TypeScript and plain HTML instead. There’s something about Unity’s editor, where you see the game change as you work, that makes it feel like you’re getting more done. You do get more on screen faster. But the design is the hard part. I didn’t have time to go through several prototypes, so I needed to test the game while I built it. Plain HTML made that easy, and it let me pin down the design without visuals getting in the way.

How the game works

Obsolete is one page split into sections, much like A Dark Room. The stats section shows what you have: resources like wood, your energy, and your population. The actions section is where you gather resources. The shop is where you spend them on items, like a cart that helps you gather more wood or a hut that adds to your population. The log tells you what happened after each move.

Each day you have a set amount of energy to spend on actions. When it runs out, you rest, and a new day starts.

The bigger goals are landmarks: a farm, a forge, a steam engine, a generator, a mainframe, and finally a data center. Each one unlocks a new resource and a new way to gather it. You have 20 days to build the data center.

Too much of a new thing

The idea that gave Obsolete its point came to me in the shower on Saturday night. I can’t remember exactly how it came to me, but I remember thinking about how web development has moved from jQuery to React to Next.js, and now to coding with AI. JavaScript is a scripting language. It was never meant to build full applications, and we did it anyway. Now, if you tell people you write jQuery, they look at you like you belong in a museum.

That idea came during one of the short breaks I took. I think those breaks worked better than days between sessions. They gave me just enough time to have a new idea, but not enough to talk myself out of it or get pulled into another project. I thought I preferred working on several projects at once. Now I think it takes up too much mental space, and it might be best to finish things one at a time.

When something new comes along, people get so excited that they try to use it for everything. That feels bad when it doesn’t work, but it’s also how we find out what the new thing is actually good for. So in Obsolete, some landmarks unlock upgrades that apply the new invention to things you already have. Some upgrades make you better at gathering. Some backfire.

The game’s original tagline was “From spark to circuit,” which didn’t fit anymore. I knew I’d need to change it, but getting the game working mattered more. A new tagline was only going to take a short conversation with Claude and a line or two of code, so I left it until the last day. It’s now “Too much of a new thing.”

Balancing by simulation

I don’t know how to balance a game. It’s the reason the last game I finished was a flop: it was practically unplayable after two minutes because the numbers were so far off. It’s something I’d like to build a process for, but I didn’t have time to figure that out during a jam.

So I had Claude do it. It wrote a small program that played through Obsolete by always making the best move it could see, then ran it 440 times while adjusting costs. I’d never have had time to play the game 440 times myself. We tuned it so a perfect run wins around day 13, which leaves room for mistakes. The simulation stood in for a balancing process I don’t have yet. It got Obsolete to a playable state, but it also showed me the gap I need to fill during my next game.

The turn limit came from The Battle of Polytopia, a strategy game with a mode called Perfection, where you get a fixed number of turns to score as many points as you can. I liked that a fixed limit gives every run a clear ending. To pick the number, Claude estimated that 20 days takes a person about five minutes to play, which is roughly how long a reviewer spends on a Ludum Dare entry.

Reading the code

I’ve started a lot of projects that got messy, and once they did, I didn’t know how to fix them. It’s been a problem for years, and it’s stopped me from finishing projects, and sometimes from starting them.

For a long time, I thought Clean Architecture was the answer. It’s a way of organizing code, described by Robert C. Martin, also known as Uncle Bob, that keeps each part separate so it’s easier to change later. If I could just follow it strictly, I thought, my code would be easy to update. I built Obsolete that way, and I still missed steps every time I added a feature.

What I actually needed was to sit down and read the code. In Clean Code, Uncle Bob says developers spend far more time reading code than writing it, more than ten to one. From Saturday into Sunday morning, I relied on Claude to tell me what to change and where to add new features. By Monday morning, I found that if I spent a little time reading the code first, I could figure it out myself. Reading the code also taught me more than any UML diagram, the box-and-arrow charts developers use to plan code. Diagrams let me nod along without understanding the tradeoffs.

Claude was a better Stack Overflow. Problems that would have stopped me completely in the past were solved in minutes, and it helped me keep going when I was tired. It took away enough friction to keep me moving, but not so much that I stopped making the design decisions. Most of the time, it was just reminding me how to use the architecture I’d already built.

The look

The visual style was another random shower thought: RuneScape. Most of Obsolete takes place in the past, and only the last landmark, the data center, is modern. RuneScape was also a game I played in middle school, so to me, it’s old tech too.

The page uses a dark brown background with panels in a lighter, less saturated brown. I used one font for everything, Pixelify Sans, a font made to look like old game text. Declaring it once for the whole page was faster than setting up a second font for the body text.

I’m not happy with how it turned out. It looks nothing like RuneScape. I wanted to add icons to every action and shop button but ran out of time. At least the text is legible, everything fits on the page, and related elements are grouped together. That’s my baseline when the design gets squeezed into the last few hours: readable and organized, but not much more. I’d have liked to spend a lot more time on it.

My accessibility baseline

The only accessibility code I added on purpose was aria-disabled. When you can’t afford something, the button for it is disabled. A button with the regular disabled attribute gets skipped when you tab through the page, so a screen reader user might never know it’s there. A button with aria-disabled stays in the tab order and is announced as dimmed, so you can still find out what it does and what it costs.

Everything else came from using HTML the way it’s meant to be used: real buttons, headings, and sections. I usually check for accessibility and test with a screen reader at the end of a project, but I didn’t have time here. So this is my baseline: what I build without thinking about it, with no testing afterward. I can’t say for sure how well it works.

Where it ended up

Obsolete still feels like a clone. It has the same stats and log that A Dark Room has. Instead of separate screens for gathering and buying, I put everything in sections on one page. What’s really different is the content and the balancing.

I’m also not sure the game makes its point well. Touching briefly on different points in history was Claude’s idea. I didn’t care either way, and it shows. Looking back, it made the game shallow. It might have been better to focus on one point in time, even a more recent one, and let the idea land there.

But it’s finished. That was the goal, and I met it. I’d hoped for ratings or comments from one or two people, but on Ludum Dare, you get those by playing and rating other people’s games. That has its own accessibility barriers, and right now I’m too tired from the jam. I might do it later if judging is still open.

I’m glad I actually built something. The design, both the visuals and the game, isn’t what I’d have liked, but I finally finished a game. Now I know what I make when there’s no time for planning and design upfront, and I’m starting to figure out how to prioritize so I can finish projects on time.

Get in touch

Questions, feedback, or just want to say hi? Send me an email.

Email me