Luna Lander: The Game Boy Lander That Only Takes Your Fuel
A lunar lander for the original Game Boy where nothing ever gets faster — the layouts stay identical across twelve levels and the only thing that changes is how much fuel you have to solve them with.
Luna Lander: The Game Boy Lander That Only Ever Takes Your Fuel Away
Most games get harder by adding something. More enemies, more speed, a nastier pattern. Luna Lander doesn't do any of that — and working out what it does instead takes about twelve levels.
It's our Game Boy take on the oldest idea in video games: a ship, some gravity, a pad, and a finite tank of fuel. And it's the cleanest example I know of difficulty built out of subtraction.
Three things have to be true
The landing rule is the whole game, and it's a good rule because it's specific.
You have to come down slowly — watch the vertical speed, because a hard descent is a crash even if you hit the pad square on. You have to arrive without drifting sideways — the horizontal speed has to be nearly nothing by the time you touch down. And you have to keep the nose up, within about 22.5 degrees of vertical, which mostly means not still pushing when you get there.
There's a little room in all three. Not much. And the important thing is what that teaches you: you land well by arriving already under control, not by correcting at the last instant. The last two seconds of a descent should be boring.
Which is harder than it sounds, because the ship starts every level already in the air with gravity pulling on it. A life with nobody at the controls isn't a pause — it's a crash.
The ×2 pad is the one you're already over
Every level has one or two pads. The smaller one pays double what the larger one pays.
And you always start above the smaller one.
So the tempting landing is the one you're already lined up for, and the safe one means crossing the map. The status bar tells you which pad you're over while you fly — X2, X1, or X0 when there's no pad under you at all, which is the spot you really don't want to be looking at.
It's a lovely piece of design: the game never forces the risky choice, it just makes the easy one worth less. Every descent starts with a small argument with yourself.
Left and right are held
The handling deserves a note, because it isn't what you'd expect from a Game Boy game.
Left and right aren't one step per press — they're held, like the engine. The ship leans into the push and its sideways speed builds for as long as you keep the direction down. Let go and it stands upright again immediately, and the drift dies off by itself.
There's no brake. To kill a drift you push the other way and then let go, rather than steering the nose round at it. And pushing sideways burns fuel at the same rate thrusting does, so every correction has a price.
That's the bit that makes the game feel like flying rather than tapping. The ship has weight, it has momentum, and it doesn't stop being your problem just because you stopped pressing.
Two worlds, twelve levels each
The title screen has a mode select, and the two modes are genuinely different places rather than a difficulty setting.
LANDER is the short world — a single 160-pixel screen that wraps left to right, so the entire landscape is in front of you at once. DESCENT is 808 pixels of world with the camera following you down, opening up to a hundred tile rows above the pad. Same ship, same landing rule, same tank. What differs is the world.
Each mode is a fixed chain of twelve levels — the same twelve every time you play them, and the same twelve on the next cartridge. Land well and you advance one. Crash and you get the same level back.
Clear the twelfth and the chain replays from level 1 — on a smaller tank. One step smaller each lap, until it settles at half of what you started with.
And that's the entire difficulty curve. The layouts never get harder. The fuel gets tighter.
Difficulty by subtraction
I keep coming back to that line, because it's such an unfashionable way to build a game.
Nothing in Luna Lander gets faster. No new hazard arrives at level 9. The pads don't shrink, the gravity doesn't increase, the ground doesn't get more spiteful. A level you cleared comfortably on the first lap is the same level on the fifth — and it's harder, because you've got half the fuel to solve it with.
It means you can't blame the game. Every level is solvable, was already solved by you, and the only variable that moved was how much room you had to do it in. That's a much more honest kind of difficulty than a difficulty slider, and it's why the twelfth lap means something.
Ground that can't show its seams
The generation behind the terrain is more careful than it needs to be, which is my favourite kind of engineering.
Five triangle-wave shapes lay out the ground, and every one of them is zero at both seam columns by construction — so no choice of depth or amplitude can make the world's left-to-right wrap visible. You can't accidentally design a landscape where the join shows.
The generator also refuses bad recipes rather than drawing them: a spawn point not over a pad, a shoulder too steep to land on, a profile that breaks its chain's size rule. It rejects the level instead of shipping it.
And a level is a recipe expanded at build time — a shape, an amplitude, a base depth, a pad span, a spawn column — turned into a 20-byte height profile. The ROM carries only the expanded bytes, so collision reads a plain array every tick with no expansion work at runtime.
Under the hood
C and GBDK-2020, no engine, in the same lineage as GB Protector and GB Checkers.
The physics live in a pure header with no GBDK in it at all, so gravity, the engine and the landing rule are unit-tested on the host before anything touches a ROM — and the built ROM is then driven headless and asserted on. The art is generated from Python; the cart is ROM-only at 32 KB with no mapper. Sound is three one-shots written where they're made: a burn on channel 1, a landing on channel 2, a crash on channel 4.
The SGB border is generated art too — a PNG turned into tiles and a map, parked in the cartridge's second bank. With no mapper that bank is permanently mapped, so the game just hands the Super Game Boy plain pointers. It's the same trick GB Checkers uses, and it's the sort of thing that only looks simple because someone did it deliberately.
How to play it
Click the screen for keyboard focus. Arrows are the d-pad, X is A, Z is B, Enter is START, C is SELECT.
On the title screen, SELECT picks between LANDER and DESCENT and START plays whichever the title names — at the level number on that line, not from the beginning. SELECT in flight takes you back there without costing you your place, so a mode you didn't mean to be in is one press from the one you did.
Backspace is rewind. Use it. Everyone does.
Go and land something
Luna Lander is free in your browser on the hardware it was written for, with nothing to install.
Start in LANDER — it's the gentler world. Get to the twelfth. Then watch the tank shrink and find out how much of your skill was actually just fuel.
What lap did you give up on? And be honest: are you a ×2 pad person, or do you take the safe one?