The first game I ever put on this site was a little Space Invaders clone from 2016. It existed to test ion-cloud, a JavaScript game library I was building at the time, and its one trick was that every invader was a random 7x7 sprite mirrored down the middle. ion-cloud is retired now and the repo had a README saying the project was finished and archived. So naturally I threw it out and built something else in the same repo.

The 2016 version, for old times’ sake

The question I kept asking was what you’d get if a fixed shooter collided with something from a casino. The answer that stuck was pachinko. In Pachinko Descent the space between you and the invaders is a pachinko board, a field of brass pins with pockets scattered through it, and every invader you break turns into a steel ball that drops through the pins.

The tray

Pachinko is a game about balls, so balls are the only currency. You start with a tray of 60. Every shot costs one ball, and a hit from the invaders (the House, a formation of living casino chips, dice and playing cards) spills twelve. Each one you break drops a ball from where it died: dice drop two, and the occasional gold invader drops a gold ball that pays triple. That ball rattles down through the pins and either lands in a pocket, gets caught in the cup on top of your launcher for +1, or falls out the bottom for nothing. Side pockets pay +2, the tulips pay +5 (a tulip opens wide after it catches a ball and shuts on the next one, and a shot through a shut tulip springs it open), and the green start chucker under the middle of the board pays +3 and banks a spin on the reels.

So aiming matters twice. You want the invader closest to landing on you, but you also want the one sitting over a lane that funnels into the chucker.

The reels

The reels are a three-reel slot machine in the middle of the board, with arrows marking the payline. You can bank up to four spins. If the first two reels match, the third crawls (that’s a reach, borrowed straight from real pachinko machines, which build entire light shows around it). Three of a kind pays out: cherries give a spread shot, bars give piercing bolts, bells a shield, stars a wider catch cup, and chips just pay 20 balls. Three sevens is a fever. For ten seconds your shots are free and rapid, a big gold pocket opens at the bottom of the board paying +10 a ball, and fourteen balls shower down from the top.

Three sevens: free rapid fire, and the gold pocket at the bottom is open

About 7% of spins are a fever and about 24% win something, so a fever lands roughly once every fourteen spins.

Cash out or let it ride

This is the part I actually wanted. When you clear a wave the House makes you an offer. Cash out, and whatever is in your tray is your score. Let it ride, and the next wave pays a bigger clear bonus but starts lower, marches faster and shoots more. If the House reaches your rail, or your tray runs dry with nothing left in play, you’re bust and the payout is 0. Not half, not a consolation prize. Zero.

The offer after a wave. That +229 was a fever

That one rule turns a shooter into a push-your-luck game. A tray of 300 after wave four feels great right up until you’re staring at wave five.

Balancing with an autopilot

I can’t playtest a gambling curve by feel, so the game has an autopilot: a simple player that dodges shots it can see coming, catches balls that are about to land, and otherwise lines up under the lowest invader and fires. It has a skill knob for aim error and reaction time. It plays the attract demo behind the menu, and headless it plays whole runs at about 70 times real speed and prints what each cash-out policy would have paid.

The first pass was embarrassing. The weakest bot cleared six waves in a row without a single bust, which means cashing out was never the right call. Each wave now starts lower and marches faster, the House fires more often with faster shots, and more of them can be in the air at once. After that, the middling bot does best cashing out after wave 7, where three runs in four survive. One more wave and survival drops to 17%. The best bot can push to wave 8, and only two of its twelve runs survived all ten waves I gave it. People are worse at dodging and better at reading a formation than my bot is, so I expect real players to bust earlier. The numbers that matter will come from them.

Deterministic on purpose

Like Coterie and Bulwark there’s a daily run, the same for everyone, and that drove most of the technical choices. The balls don’t use Godot’s physics engine. They bounce off pins in about a hundred lines of GDScript, three substeps a frame, with the pins bucketed into a 32 pixel grid so each ball only checks the handful near it (and a ball balanced on top of a pin gets a nudge, because otherwise it will sit there forever). That makes a whole run reproducible from its seed and your inputs, which the tests check.

The seed is split into separate random streams for the board, for each wave’s formation and for the reel draws. So the board you get doesn’t depend on how you played, and the fourth spin of the day is the same spin for everyone no matter how long it took them to bank it.

Everything on screen is drawn from primitives, chips and dice included, and the neon glow is just soft radial gradients blended additively over the board. The sounds are rendered by a Python script like the other games. The first time I ran it, the reel spin sound never finished. Each tick came 10% sooner than the last, and those gaps added up to less than the length of the sound, so the loop never reached the end of it.

It plays on a phone too: hold anywhere and drag, and the launcher follows your finger and fires on its own. It’s at pachinko.twinspear.com. Cash out earlier than you think you should.