EXAPUNKS by Zachtronics is a programming game. You play as Moss, an old hand forced to return to cybercrime to afford meds.
The game uses a limited assembly-style language with the ability to do read and write files, communicate with your other programs, navigate networks, and use special hardware registers, depending on the host.
The game provides you with a couple of zines that detail of some of the systems, and which serve as a manual for the language. They are in PDF form, either for printing or for reading on your computer.
Because you’re trespassing, you have to leave no trace in most levels. This means no files sitting around, no programs still running, no deleted files on foreign systems, and so on.
I’m not sure how the average non-programmer would take to this game. Some of the challenges are hard, even for someone like me who knows a bit of computer programming. I’d say that this is a game for programmers first. People who otherwise pick it up might need some help, but that’s okay. You can always learn.
But for a programmer, this is a fun game. Even for the easier levels, you can try to golf (solution with fewest lines of code), or you can try to use the least cycles. For the harder levels, I was happy to get a solution, even if I knew there were more optimal ways that eluded me. And on some of the hardest, I found myself with no choice but to golf to try to get the number of lines within the budget. (You can proceed if you have a working solution over the line budget, but I’m proud to say I was able to get every one under it, eventually.)
Sights and sounds.
As you load the game, a fast-paced techno beat plays, and as you go through the various levels and side games there are nice background loops keeping you company.
Cool music, nice GUI, a general 1990s cyber vibe complete with an IRC window where others talk about the goings on in the world while you lurk. It’s a nice interface that adds a lot of texture to the game. You’re not just doing programming challenges, you’re stepping into this game world and roleplaying as
The programming UI also has some nice features to it. You can move the coding panel around. Clicking on a file in the network will highlight it on the sidebar so you can see what it contains. The editor lets you select, copy, paste, and highlights a few errors, including jumps to labels that don’t exist.
You can also make copies of your solution to a level or start a new one without overwriting your previous work. That can be handy if you want to golf or you want to do some testing.
About the language and environment.
You have one general-purpose register, a test register (used for conditional jumps), a file register, and a messaging register (with two modes, one for global talk, the other for host-only talk). You can hold one file at a time.
It’s integers only (-9999–9999) and operations that would overflow simply stick at the maximum or minimum. You can add, subtract, multiply, divide, and take the modulus. You can also
swiz. Swizzling is something I was unfamiliar with, but given you store four-digit numbers, swizzing is effectively the ability to address each digit:
copy 1776 x
swiz x 14 x ; x= 61
addi x 200 x ; x=261
swiz x 234 x ; x=620
Note that zeros are implied in empty higher digits.
Swiz can let you do some interesting things, like packing four flags into one piece of data.
There are also strings that come into play, but you can never create strings, only copy them from files. Once copied, you can pass them around or test against them, but you can’t manipulate them.
The instructions and registers are limited but adequate. They make the challenge harder, but also make it more rewarding to figure out. (How many times did I want to have a jump-back type instruction, so I could have outright subroutines?!)
You can execute multiple programs (called exas) at once, either by writing separate code for them or by forking off from an existing one to a specific label. They can talk to each other, but only in a broadcast manner. If you want to have multiple conversations going at once, be prepared to write some complex code to manage it. (Mostly better to avoid this complexity!)
You can make your own game, and you can also make your own programming levels (or play those from others). I made a simple game just to try it, where the screen would fill up one dot at a time, and you pressed the button to try to stop it at a peak. I only briefly looked at some of the levels of other players.
There’s a tetris-ish game called “Hack*Match” where you have to match four-or-more of a kind to clear them. This was fun for a bit, but it has a 100 000 points achievement associated with it. This took me many tries. My natural skill capped out where I could easily get around 40 000 without a sweat, and more if I pushed it or got luckier with the PRNG. I’d get the one-offs in the 70s, and then in the 90s, but 100K was elusive. (I don’t think I ever had a game end in the 80s, oddly.)
And there’s also a solitaire variant (you have to beat it 100 times for the achievement). It’s not that hard, it’s decently fun.
Aside from the five side-game achievements (two for Hack*Match and three for solitaire), there are a number of achievements requiring you to revisit the programming challenges with an eye to doing a different programming challenge in the same space. These weren’t too hard, but are fun little alternatives to do later in the game.
It took me about 100 hours to beat the whole game and get all 16 achievements. Without the solitaire and Hack*Match, I’d guess it was 85 hours. I really enjoyed the programming challenge, and I’d recommend you take a look if you’re decently familiar with coding and want to take on a challenge.
Note, if you’re on Linux you may have a problem running the game. I did. The fix is to add
TERM=xterm %command% as the command-line so that it doesn’t try to use an incompatible version of
terminfo. Github: Mono: Issue 6752 has some details.