Kepler452b came out in 2020 for Windows, Linux and MacOS. It was an Electron app, about 9,500 lines of JS, drawn with a licensed Oryx tileset I could never put on a public website. It worked fine. It also hadn’t been touched in five years, and showing it to anyone meant sending them an installer. So I rebuilt the whole thing. It’s Godot 4 and GDScript now, it plays in the browser at kepler452b.twinspear.com, and most of the people playing it are on a phone.
Nine buttons and no more
A traditional roguelike has a key for everything. A phone has your thumb. So the rebuild started with one rule: the touch bar keeps its nine buttons, and nothing new gets one. Every system added since has to reach the player through something that’s already on screen. Tap the health bar and it uses your best heal. Tap the log and it opens the message history. Hold your finger on any sector to scan it, and a card tells you what’s there: whether an enemy is asleep, wandering or hunting you, whether it’s standing in the light, and how an item compares with what you’re carrying. The supervisor on the radio explains each gesture the first time it matters. A keyboard still gets a key for everything, since keys cost nothing on screen.

Three things in your bag
The old game had ammo, ten “improved” weapons and an inventory you scrolled through. Now every class carries a weapon, a skill and a device, plus a bag that holds three things. Heals, batteries, unknown vials and spare weapons all fight over those three slots, so every pickup is a decision, and swapping a weapon in from the bag costs a turn. Ammo is gone. Everything runs on energy, which refills on its own once nothing is hunting you, and melee costs nothing at all, so you’re never helpless, only exposed. Health only comes back from items and beds. Energy is per fight, health is per run.
The classes got reworked along the way, and the weak ones got the most attention. The pyrotechnic’s molotov now sets its target burning for nine rounds and the eight sectors around it for three, and anything on fire leaves fire where it walks, so one throw into a crowd keeps paying. The pyrotechnic is immune to fire, which flips the danger: you want to stand in the blaze, just not next to whatever is still swinging at you. The scientist’s grapple stuns what it pulls in for five rounds so you can run, and the new cryo spray bites for 1d6 every round its target stays frozen.
Clean-room art
The Oryx tiles were licensed for the desktop release and can’t be redistributed, so every sprite in the game is redrawn by Python scripts. Each one was briefed by what it does in the game, never by what the old sprite looked like. That rule mattered most with the walls.
The first set of walls was a thick block per tile with an outline around the top. You couldn’t tell how a wall connected to the one next to it. What I wanted was the 3/4 view most tilesets use: a thin wall where you see the top and the front face at the same time, so a corner, a T and a crossing all read at a glance. Before touching the game again I had it mocked up as flat shapes, no texture, and went back and forth on that one image until the windows, the doors and the wall ends were right.

In the game every wall, window and door is the same band: 6 pixels wide, running through the middle of its tile, with an arm reaching toward each neighbour that’s also a wall. Raise the band 10 pixels and it becomes the top, and wherever it ends going south a 10 pixel face hangs below it. That one rule is the whole design. The script draws an entire map with it, then cuts the result into the 314 wall, window and door tiles the game actually places, each named by what’s around it. Every time it runs it also draws random maps both ways, whole and assembled from tiles, and fails if a single pixel differs. Windows, doors, end caps and joins all come out of the same rule, so a new kind of junction can’t quietly break.
Two things only showed up once it was in the game. The mock raised every wall’s top into the tile north of it, and the fog of war and the lighting both work one tile at a time, so the top of every outer wall would have been eaten by the fog. The band now sits 5 pixels lower in its tile, which looks identical and never leaves its own tile. The second was thick walls. The generator builds plenty of walls two or three tiles deep, and a thin band through each of those tiles drew a lattice with floor showing through every hole. Now wherever four walls meet in a 2x2 block the hole fills, and thick walls come out solid.

The upgrade terminal’s room was the last holdout. The original game ringed it with pillars standing on wall tiles, and those were still the old chunky sprites sitting on top of the new walls. The ring is plain wall now, with one lit strip along the inside face so the room still stands out.

Next is balance. A bot plays every class through seeded runs with no screen at all, and right now the mercenary gets more than four times as deep as the scientist.
