This review contains spoilers

I can divide the entirety of my interests into 4 things I love: learning, games, writing and programming.
Career wise, programming is the love I've chosen. I am currently pursuing a degree in computer science (I am a year 3 student), and I intend to get a job as a software engineer after I graduate.
To me this seems like a good choice so far, my classes are exceptionally interesting, I enjoy programming constantly, and software engineering seems like a field where financially I'll be set.
There is a sacrifice to this choice, my vast intrinsic love of programming is tainted by the fact that i must sell my skills and attention. I first learned programming as a means to an end to make games, and now I learn programming in order to deserve the right to exist. Between those two heavy extrinsic values, i hope to keep my deep intrinsic love of programming alive.

Fortunately, this isn't a review of living under capitalism...this is a review of a zachtronics game. I wrote that preamble to illustrate how much I am the target audience for Zachtronics programming games. Not only are they the type of challenge that I've most devoted myself to learning, but they're a manifestation of the intrinsic value of programming

The time I spend programming in Zachtronics games is fun and refreshing: it's less frustrating, it's way easier to understand why something doesn't work, i understand the entire scope of what I'm doing, the game has incredibly interesting constraints and most importantly it's utterly useless. Instead of programming to save time, gain grades/money or bring a game to life, I am 100% programming for the joy of the challenge. {Sidenote: I also enjoy programming challenges such as projecteuler and adventofcode, which have a similar appeal to me}

It's really easy for my opinion on games like Shenzhen I/O or EXAPUNKS to be "Zachtronics Programming game 10/10". I feel this is underselling these games. Zachtronics does not keep releasing the same game with a different skin. Their games are like siblings, any parent could tell you how different they are from each other (while still sharing so much in common).

So the baseline for this review is that programming games are some of my favorite experiences, time to actually talk about exapunks


Exapunks is one of the most approachable programming games I've played, it is not arcane like tis100 nor does it greet you with the sheer immense challenge and constraints that shenzhen i/o does. At first, I saw this as a negative. Having beaten shenzhen i/o, I cruised through the first couple levels of EXAPUNKS. It wasn't until the last third that I encountered levels that were truly a struggle.

This does not mean that the game was not interesting until those levels. My skill meant that I got to treat my playthrough like a prestige run, playing the deeper game: optimizing. Instead of moving on once I had created a solution, I moved on once I was satisfied with my solution. {I clicked the post-victory continue editing button more times in this game than I have all other zachtronics games} Even in the initial planning of each level I was already considering activity/speed and size tradeoffs or discarding ideas i considered inelegant.

When I played TIS100, my friends leaderboard scores taunted me. While playing exapunks, I was constantly surprised that after finish a level where I had made some compromises I’d still be above many of them. The rush of satisfaction and self-confidence from seeing I’d beaten other scores was one of my favorite parts of the game.

I adore the 3 optimization metrics in EXAPUNKS.
Cycles
Speed/Cycles is a classic that is very natural for me to want to optimize, it’s even more interesting more in exapunks due to the game’s focus on multithreading. In exapunks, deciding how much parallelization to do is like a difficulty option. Concurrency frequently introduces interesting complications and makes your solution much more work to implement… in return you get SPEED. I love how much of cycles optimization encourages approaching the problem in an efficient way, rather than just being able to do things in less lines of code {which is important too,especially for loops…one of my favorite discoveries was a size optimization regarding for-loops}
Size
It’s refreshing for size to be purely an optimization metric as opposed to also an inherent limitation on how things are implemented (these exas have scrollbars and it’s great!... except they’re a little more annoying to debug}. It’s a really clever idea to have a maximum size in order to be considered for leaderboard scores ( every single level I stayed within that limit). Not only is this kinder to players who are just trying to get a solution, but it feels like an interesting constraint for cycles optimization which is hungry for size. {Especially with loop unrolling which I enjoyed a lot}. Lines of code is generally a metric I’m not very interested in, here there were a couple of levels where a slight size optimization had an incredibly satisfying side effect of also increasing the speed. The best part about size optimization in this game is how clever you can be with how you use registers. Some of the things I discovered I could do in just 1 line are quite satisfying.
Activity
Activity is an interesting one, I like how it’s a penalty for two separate things (traversing hosts and killing exas). It’s pretty trivial to figure out what the minimum required link hops are, then it just becomes a constraint to how you design your solution. Pursuring low activity often means you have to do things in a slightly more annoying way, but I think it actually helps you learn some of the vital exapunks skills. The best part about going for low activity is how it interacts with the limited bandwidth of the m register, this often introduces interesting complications in solution design.

For my playthrough I decided to prioritize both cycles and activity (I find multi metric optimization much more interesting than single metric optimization). I also decided to choose the dominant metric in that pair thematically… on hacking levels I usually went for minimum activity , on body programming levels I was willing to use extra activity in exchange for fewer cycles.



I love the variety of level types. It’s great for pacing and they have great fundamental differences.

Leave no trace- It’s incredibly interesting that most exapunks levels are designed around doing something once and then cleaning up after yourself. This sets it way apart from every other zachtronics game. It’s like the opposite of what I’m used to doing, that’s a very cool way to capture some of the spirit of hacking. It’s just such a great paradigm shift for exas to not be programs that automatically loop, which can be arbitrarily be terminated or started. Within this framework the activity penalty for killing also shines.

The phage- Cute how it becomes a nice break to go back to levels that are more in the tis100/Shenzhen I/o style: manipulating input data to get output data. I love the idea of fighting a terminal disease by programming exas for your body, unfortunately I don’t think the game does enough with this concept.


Hacker Battles- These are my favorite level type, they’re a huge highlight of exapunks. I love how you have to consider design, implementation and strategy. Having to make strategic choices is so fascinating, exapunks has shown me that this is a really underexplored design space in engineering games. It’s also neat how the 3 optimization metrics are built into your performance: you’re racing against your opponent (cycles), have a line of code budget (size), and get penalized for killing (activity). Hacker battles Tappeal to my love of multi-metric optimization. I was also impressed by how well designed each battle was, they accounted for a lot of different types of cheese while leaving you with various approaches you can take. The biggest problem with them is that I didn’t have good enough opponents from my friends list. I put a lot of thought into each of my solutions, and felt disappointed how rare it was to face up against a solution with an equal amount of thought put into it. I’d love to spend more time analyzing an opponent’s solution and then adapting. I’d like to shoutout the last 2 hacker battles, the focus on controlling territory/filling the board with your exas is way more interesting than the other battles.

My favorite part about the exa’s language is the registers. You have so few of them and they’re all special. There’s so many discoveries where you can apply the properties of a register to do something neat and interesting challenges where it feels like you don’t have as many registers as you want.
Operations that set or jump based off a test bit reminded me a lot of my time learning MIPS. The T register is an incredibly neat because you can use it for it’s intended purpose for conditionials and you can also simply use it as an additional register that you have to be careful not to wipe at the wrong time. The M register is part of the heart of the game, a lot of the challenge of the game comes from figuring out how to use such limited bandwidth for communication. I adore the complication that it’s undefined which exa will read if multiple are trying too.

The Files are probably the weakest part of the language for me. I don’t find file input/output that interesting. There’s some clever things you can do with them, but they’re a little too annoying to deal with. It’s also weird how much of the action is going on in the files, seems like a misuse of the screen real estate. This is especially egregious because the gifs you export don’t really show what you’re doing to files. I would have preferred a game that was much more about the environment of hosts on your screen rather than their files. It’s weird to me that despise how unique exapunks is, so many of the levels just come down to data transformation. Exapunks really has a lot of missed potential on the spatial/ environmental systems aspect of its levels. A lot of my favorite levels are the ones where you aren’t doing that much file manipulation, and I feel like those are much closer to utilizing the potential of the game.

Speaking of the level environments, I’m not a fan off all the extra fluff in levels. I’d rather have all the elements be relevant to the problem I’m solving or the game commit even more to the levels being open-ended environments. The balance exapunks chooses between these two doesn’t work at all. I was disappointed by the achievements in this game, they’re all doing something random and uninteresting with otherwise pointless level elements. In regards to poking around a system and exploring what you can influence , Exapunks isn’t even competing with games like uplink.


Story-wise exapunks is ok. I think Eliza, another game written by Matthew Seiji Burns has more interesting things to say regarding AI and how people live in a world of tech.
I like the EXAPUNKS chat room. I dislike the conversations with ember. . My main problem with the ember conversations is that they both fail to be thought provoking and fail to allow me to express my opinion. I do like the ending though.
I think the story succeeds more at being evocative than interesting. The thematic opposition between the rebellion that’s inherent to hacker culture and following ember’s instructions is interesting and a bit underexplored

The world of exapunks is incredibly interesting. One of my favorite things to see in worldbuilding is alternate ways for computation to exist , exapunks does a great job in appealing to that. I quite like the concept of EXAS. The best part of the Zines is all the extra random stuff in them. I was pretty disappointed in the short fiction story though.

Narratively, I like the levels where you’ve decided to take it upon yourself to do something. Thematically, I’m a fan of any level where the track“Leave No Trace” plays. Those always feel like “things just got serious, you’ve woken up and chosen violence”. The soundtrack is cool, although I spent enough time in each level that I pretty much got my fill. I think they did a great job of matching the 6 or so different level tracks to the various missions. (I wonder if having to space out uses of specific tracks had any influence on the design of each level)

The side distraction minigames are pretty cool… except Zachtronics cannibalized them for later games. The solitaire is obviously in the solitaire collection and hack n match is in last call, so before even playing exapunks I had my fill of both. I am a pretty big solitaire fan, but unfortunately the solitaire in this game is by far the weakest one zachtronics made. Hack n match absolutely rules though. I’m a huge puzzle arcade enjoyer, and this brings a unique take. Like seriously hack n match is so interesting, it deserves more than being a side zachtronics minigame. I also enjoyed how you had to actually do a relevant programming level to unlock each of the side content activities in EXAPUNKS


One thing exapunks does worse than all the other engineering zachtronics games is watching your solution play. Your choices for playback speed are much too slow (unless you’re debugging), too slow, and much too fast. My problems here are related to some complaints I’ve already mentioned. The gifs you produce aren’t that interesting. Besides a few exception levels, there’s not even that much to watch.
It is really frustrating that there’s no useful way to skip to the first test case that fails, it’s a bit too much work to reproduce an unexpected failure. Also the system where you focus on exas/files is a bit jank especially when you have large code blocks and replication. It’s strange that you can detach an exa’s code from the left pane… while the simulation is running. I’d be nice if that saved for when you returned to editing. One thing I do appreciate though is actually having enough horizontal room in each line of code to actually usefully name things.

Finally I want to mention how much I enjoyed the final few levels. They’re where exapunks really shines. The most interesting way that the game scales in difficulty is how levels will ask you to do multiple things that are each fairly complex, and together they’ll put a great strain on how you use your registers and exas. Once I got to these levels I let myself be looser with what an “ideal” solution was. This was like taking off training weights in anime. Allowing myself to just do the naïve approach avoid a troublesome implementation of concurrency or use an expensive activity technique felt very freeing, a fitting retribution against the late-game difficulty. I especially enjoyed the final level. My solution for it is utterly deranged. I’ve played quite a few programming games where the final boss is sorting, exapunks has a powerful enough toolset that it can take it one step further: you have to find the data yourself in a randomly generated tree. Also shoutout to unknown network 2 (unknown context), that was a very interesting level. It’d be cool if more levels reacted to your intrusion like that. {I’m not sure if there was anything more menacing than reading the words “Note: some links may disappear as a result of your actions”.


Exapunks is awesome. It’s currently my fifth favorite game of all time, right under Shenzhen I/O

Reviewed on May 18, 2023


Comments