Closer Look: Run-On

Randomly generated ZZT action in this endless-feeling runner

Authored By: Dr. Dos
Published: Dec 1, 2018
RSS icon

zzt_136

From the very beginning, there's been an interest in seeing just what you can pull off with ZZT-OOP. It's an incredibly simplistic language, with just 27 commands in total, a handful of conditionals, 10 flags, and a few counters. In City of ZZT you can see what would be the first ZZT engine, a robot in City Hall that's controlled by touching objects to send messages to make the robot move or shoot. It's very basic, but the sheer number of games which would be entirely engine based, keeping the player surrounded by objects would grow rapidly over the years.

Throughout ZZT's history, there's also been a lot of attempts to take existing game systems and convert them to ZZT, with varying degrees of success. But for authors who did something that hadn't been seen before, it was enough to get a lot of attention. Jojoisjo's 4 is an incredibly bland adventure game, with a story that isn't revealed until the final board, a lot of desolate areas, and graphics which suffered due to the very engine that made it famous. It received a lot of accolades though for the being a first-person point-and-click adventure title, accomplished by setting ZZT to mouse controls, and steering a cursor object around a scene composed entirely of fake walls, save for objects that could be "clicked" on by bumping into them to cycle through verbs.

For many years, the sort of holy grail of engines, was Tetris. ZZT's certainly blocky enough for it to seem like it should be a natural fit, but it eluded all who tried. Objects break apart when moving as groups, the pieces would have to stop being objects once placed since they need to heed the stat limit, and good luck getting smooth rotation.

Eventually, Masamune succeeded... kind of, with ZZTris, which checked for lines by turning the blocks to fakes and seeing in the left side of the well could shoot the right side. The code is a mess, the pieces are only triominoes rather than tetrominoes, and the game almost always causes ZZT to crash when you quit it (and sometimes during play), but these were concessions ZZTers were used to, and Tetris was considered solved.

So where do you go from there? By this point in addition to Tetris, ZZT had racing games, sidescrollers, a gluttonous abundance of RPG engines, and more. All of these pushed ZZT in unexpected ways, and all of them were full of compromises that kept them from ever competing with standalone games that used such mechanics.

WiL's Run-On is a cop-out as much as any of these other engines. It looks to procedural generation as a way to create a game that's never the same twice. ZZT is not very friendly to this sort of thing, and the concept behind the engine is as clever as it is primitive.

Run-On: Adventure

The level generation is simple. A column of objects on the right will do a few tests to see if they're blocked in random directions, after several of these checks they'll #put w <element>. All these elements have one thing in common: they're pushable. These objects produce a column of boulders and sliders, and repeat until the player has been pushed back to a certain point. All the while, the previous portion of the board is changed into boulders and sliders as well, and an additional column of objects sits on the west end of the stage, endlessly looping over #put e empty. When the player has been pushed back far enough, the generator stops and the boulder and sliders are transformed back into the various level elements, lions, ammo, walls, forests, whatever WiL likes. This results in a sort of treadmill which generates content indefinitely.

It's hooked up to a timer to generate after so much time passes, and a torch based counter that decrements with each column of level generated to detect when a level is completed. That's all that it is, but WiL manages to find ways to make it both a lot of fun, and extraordinarily grueling.

The player receives a plot about being chased by darkness and having to outrun it to safety. The first quarter of the game is directly related to this, with the player running through a forest, graveyard, desert, and city streets to escape the darkness. WiL makes adjustments to each world, trickling out new concepts. In the graveyard, a duplicator will try to spawn in object based zombies. In the desert, the sun will cause the player's health to drain slowly from the heat, which can be replenished by defeating cactus enemies (in addition to gems and shopping between levels).

In short, playing Run-On means moving the player towards the objects that generate a level, for 3 hours of so (which is a lonnnng time for a ZZT world, let alone one that is based around reusing an engine). Let me break down the way the game progresses with some information on each world the player runs through.

zzt_175
zzt_179
zzt_180

The Forest is the game's impressive introduction. Though I had tried the game when it was a new release, I still found myself wowed by the engine today. I was surprised at how fast levels generated, and how it was able to entertain despite being very restricted in what kinds of environments it could generate. We're dealing with ZZT at its most primitive here, shooting lions and tigers while picking up ammo and moving around walls.

The early game may actually be the most challenging since it takes some time to build up sufficient ammo reserves. At the end of each level, the game lets the player spend their gems on ammo, health, or both, but I found myself having to dump everything into ammo to get started, which made any damage taken even more dangerous as recovering it was very slow.

zzt_207
zzt_215
zzt_216

World two, Graveyard, expands on things slightly, introducing an object outside the playfield connected to a duplicator, which may or may not be able to spawn inside the current level. The palette changes, but things don't feel all that different. It's still entertaining, still well coded, still a pleasant experience, and that's about it.

There's some minor strategy in making sure to not shoot breakables that show up in front of the zombie spawner, keeping it blocked as much as possible when RNG permits, but the zombies aren't much of a threat and can typically just be ignored.

The game offers settings for the speed at which levels generate, and maybe playing on a higher speed than the default would have benefited things since a lot of Run-On is spent up at the edge of the level waiting to be pushed back by the next cycle. Alternatively, letting the player touch the edge to force a generation could help speed things up as well. It's not a big deal at first, but later worlds get extremely tedious.

zzt_317
zzt_325
zzt_326

The Desert is where I began getting worried. WiL went from one object to two (though it's an option where there can just be one cactus spawner if the player wants to make things easier). I was about three-fourths through this world before I even noticed that my health was slowly draining due to the desert heat. By now, I was convinced I had seen what the game had to offer, which was some fun frantic action.

The heat mechanic is a bit too subtle to notice along with the player getting health for defeating a cactus. It's not necessarily a bad mechanic, just one that doesn't really contribute anything in its current form.

zzt_367
zzt_378
zzt_379

The Street however, mixed things up enough to feel fresh again. The level generators here are clearly biased to make a lot of "buildings" out of breakable walls and a path down the middle. This world had personality, and is also unique in that it has a boss fight at the end, albeit one in a static layout instead of one that still involves running across the board while fighting.

This world was probably my favorite as its generally open layout made the game more about action and collecting power-ups rather than trying to just hug the edge of the level as much as possible. It felt like my play was more active than passive.

zzt_400

That boss fight though, yikes. I was very excited for it when it happened, suddenly a wild taxi would rush down the street trying to run down the player. Shooting it will cause it to stagger slowly until it hits a wall and reverses, and some additional duplicators open up to provide health, ammo, and bombs which are needed to defeat the boss. It takes way too many hits, and as the taxi does nothing but charge in a straight line it becomes pretty trivial to stagger the boss. The hardest part is just getting the bombs and items since they move around very fast and randomly before disappearing after a set amount of time has passed. Once you get a bomb, it's simple to push it against the cab while it's staggering backwards and run out of the explosion radius.

zzt_426
zzt_437

The Clouds serves as an intermission, with the player confined to a narrow and now manually scrolling world with high generation of creatures. They can leave at any time they choose to, but are unable to proceed to the next set of worlds unless they either have 5 keys which spawn randomly among the clouds or reach a score of 1700 points.

This world is an odd one, but very well done. Nothing in the game warns the player that score would be needed to progress, but I had something like 1500 points without trying to go out of my way for points when I got here. In theory it could feel like a grind, but the keys serve as an smart alternate method to proceeding, and I picked up three of them just getting my last few hundred points. I do wish the game explained that the world doesn't actually scroll until the player reaches a border. I didn't notice it at all in my playthrough and only discovered it when getting some video footage later on. It adds a bit of tactics to things as you can halt everything on the board as it shifts essentially at will.

It actually felt quite stressful without this knowledge! the small size of the world combined with a lot of creatures makes it very dangerous to move around in!

zzt_471
zzt_466

Red/Gray is the first of the "Worlds of Chaos", and it sets the stage for the next portion of the game nicely. The board is now dark! The shape is now more complex than just a rectangle, and the board shifts in multiple directions.

This world was generally pretty fun. The rules for encoding things on the board would change over time, so a group of tigers might transform into gems on the next shift, and then those gems may turn into walls afterwards.

zzt_489
zzt_498
zzt_499

Blue/Purple changes things up again, with a small board that's loaded with walls that change colors and physical properties (cycling through solid/normal/breakable/water/fake). Only objects spawn as enemies, but they shoot at the player, and spawn default enemies when shot (which includes being shot at by other enemies) making things very dangerous. My patience was getting pretty thin here, and there's a lot more to go.

This is probably the point where the game starts feeling really tedious. The shifts are small which make the time spent in each level take awhile, and the fakes/normals make it very slow to actually navigate. It's easy for a wall to suddenly stop being one and for a creature to attack without warning.

zzt_529
zzt_535
zzt_540

Cyan is where the game gets very weird, and starts to show cracks in its ability to function. There's no chase, just a level which changes over time, and four pillars that need to be "pushed" over to complete the world. How specifically to proceed is unclear, and there are spinning guns and ricochets which means that as the level shifts, suddenly where you're standing will have several bullets turn in the player's direction.

zzt_557
zzt_563
zzt_564

Multicolor follows and it gets bad. The layouts are congested, but there's no longer a "forward". The board shifts in both directions at once (alternating each row), but will sometimes change which direction each row moves in. This makes it very easy to get pushed off the edge and game over without warning as the amount the level shifts is based on how close to "forward" you are.

zzt_610

This world also has the player finally fight the darkness they've been chased by this whole time.

Yes. This list of worlds is still going. Even with the conceit of the game defeated. This is just a little past the halfway point. Now it's time for the "Worlds of Triumph" where things get really weird.

zzt_626
zzt_644
zzt_650

Here in Active Semantic, you're no longer actually playing Run-On as it's been played. Now you're playing a randomly generated side-scroller. The object the player controls always moves forward and your only input is to jump and shoot. ZZT begins to break apart. DOSBox can't keep up and the engine slows to a crawl (WiL even says to crank up the game speed but it's not nearly enough.)

zzt_692

Perhaps stranger is that eventually caves spawn that the player can go inside, with the (non-random) interiors appearing in the lower portion of the screen and returning to an overhead view of things.

It's all so impressive, but a chore to put up with by this point.

zzt_627
zzt_718
zzt_785

If you thought things couldn't get any more weird, Run-On suddenly stops running, placing the player in a bar where they must work up the courage to leave and continue onward. Welcome to Passive Semantic. Here the game becomes a sort of puzzle of finding the correct order to interact with objects in order to collect a few keys and build up your courage.

It's a welcome respite, but by this point you will just want the game to be over already.

zzt_628
zzt_851
zzt_854

Finally it becomes time to face Death. No, this isn't the last world either. The engine changes once again, this time with objects that form long stretches of walls that the player has to run through and hit buttons on alternating sides of the board. The only enemies are "newbies" that sometimes drop gems when shot, but cannot be defeated (and shooting them too much means you're too mean and get a game over). Bugs here make it possible to find yourself able to run across the levels before they've finished generating, nullifying the entire point of the world, while also taking several minutes of being in no danger and just running back and forth across the screen before the game finally lets you move on.

There's a new mechanic where you can buy health boosts with the gems, but it only ever worked once for me. With this and the ability to cross the board before its ready, this world struggles to entertain. I wanted to be free of this game.

zzt_890

Once in a while this would happen as well and the engine would break entirely, making me reload a save.

zzt_960
zzt_970
zzt_972

The Worlds of Triumph give way for the "Worlds of Haste". I was trying to keep my criticisms of the game confined to the "Chaos" section of the article, but so much is seeping through here in just covering the worlds!

The engine changes again, and WiL once more requests the game's speed be adjusted. The effect is neat, using slimes as a form of randomness, and letting the next chunk of the level be generated while the current chunk is being played.

ZZT strains once more, the game getting slower and slower as things go on. Perhaps the final straw was realizing that the engine bugged itself silently. Eventually I noticed I was on level 78 and finishing the level took me to level 78 again.

zzt_1022

The engine itself would also sometimes just explode on its own, with a slime breaking loose and the engine coming to a stop.

zzt_1028

Other times a random row would just decide to stop pushing forward, also breaking things beyond repair and requiring a save to be reloaded.

zzt_1043
zzt_1046

Finally, it's here. Stadium is indeed the final world of Run-On. This slime-powered arena shooter is... actually a ton of fun, but with such an utter lack of energy by this point I wanted nothing more than for it to end. An arena is generated and some ZZT creatures appear. The player must score enough points to advance in level, but every time they're hit the return to the purple box and a new arena is generated (with a "penalty" torch given). The goal is to complete the arena with the limited resources remaining, and do so without too many penalties.

How many penalties is arbitrary. Whether or not you get to access the game's "cryptic" ending or not is based on having a specific number of penalties. There are a few that open it, but it's not as simple as keeping them below a certain threshold.

So that's what you're in for if you dare to tackle Run-On. A nearly endless runner that doesn't know when to quit.

Run-On: Chaos

In many ways, Run-On is simply a terrible game. It accomplishes so much with its numerous engines, but whether or not any given moment of the game is enjoyable seems just as random as its levels.

In the early portions of the game, it's a bit misleading. The first world is awe-inspiring, but when the second and third feel so much like more of the same, you begin to wonder just how long of a game you're in for. It feels like all its tricks have been shown off, and that now you're just stuck on a very long ride until you get to the end.

The good news is that it becomes apparent that WiL was not content to just come up with this single engine, and came up with several variants. Worlds have differing shapes and ways of shifting things sure, but it's the later worlds that show variety in the engine itself. There's the swamp where the next portion of the level is produced not after a set time, but on the fly, and once the next chunk is ready it shifts. This gives the player a chance to try and read the encoded elements and figure out what's coming up. There's Death where objects make simple maze-like walls, and the player must reach the end and hit a button to generate the next maze, where they then turn around to reach their starting point and hit another button. There's Active Semantic deciding the game is a platformer now. There's the stadium's excellent gauntlet where the player fights monsters until they've been defeated or the player is harmed.

WiL has so many ideas for randomly generated gameplay, but seems to have been unwilling to ask if that gameplay was any good. There are fourteen different worlds in this game. Just over half of those I'd describe as fun to play, but even among them the sheer length really tarnishes even the game's high points.

WiL frequently pushes ZZT past its limits, and it's impressive, but so much of it doesn't work. Maybe it's DOSBox and not ZZT, but eventually the game can't keep up with itself. Things start lagging. The sidescroller is by far the worst of it. What begins as smooth level generation slowly becomes bogged down by itself, and begins running more and more slowly. What begins with taking a few seconds to generate a playfield eventually means waiting something like 15 seconds. Saving, quitting DOSBox, and restarting it will immediately correct this, but it really breaks the flow of the game.

Other worlds, such as the swamp in the "Worlds of Haste" segment, also get laggy. I swear I was even getting phantom inputs at one point, watching as my player began running left when I'd have had no reason to consider moving backwards. It's outright bizarre, and by this point so much time has been sunk into the game that you just want to quit.

And honestly, wanting to abandon playing the game isn't something that's happened with any of these Closer Looks before. Your typical bad or buggy ZZT worlds are usually pretty short, or easily recognizable when it becomes time to cheat. Run-On put me in a literal unwinnable limbo and I don't want to think how long I was trying to end it. At once point I was even cheating to make the board dark so I could burn torches as a light source and maybe shave off a generation before completing a level. I cannot stress enough that when this game fails, it fails so utterly spectacularly that I can easily say it's the least fun I have had with a ZZT game.

Most poorly designed ZZT games that have clear effort put into them usually have pretty simple fixes. For Run-On, the game is in desperate need of an editor willing to tell WiL "no". There could be half as many worlds and the levels within could be half the length they are and you'd wind up with something far more enjoyable, but WiL seemed to be on a roll with coding and would not stop for anything. This game outstays its welcome time and time again, and I kept hoping each world would be the last.

Run-On: Triumph

But for all my yelling above at how incredibly incredibly bad Run-On is. It's still spectacular. For all the times I've had the engine itself fail on me, not once did the game generate a level where I was blocked off from moving ahead (there's a contingency cheat the player is meant to use if they're surrounded and/or need ammo to move forward). All my worries that eventually some bad luck would result in a bunch of solids and water tiles never came to fruition.

It is clear there are bugs in the code, but it is also so clear that WiL took an impossible concept, a randomly generated ZZT game, and not only made an engine for it, but made maybe half a dozen of them. What he made here is so incredibly unique that it's a shame that he didn't know when to quit. I wonder if he decided to make the game extremely long just to hammer home that this game of infinite replay value could be played for hours and hours and hours. (I would never ever consider playing this game again.)

This game could have been split into two or maybe even three games instead. Playing from the forest to the streets and fighting the darkness at the end rather than a... ghost taxi... would have been for a game that was satisfying, maybe a little long, but ultimately comprehensive and entertaining. Keeping the game short would do a lot to encourage replays, and shifting to a score-attack instead of just survival might help the replay value as well. Instead of playing through those first four worlds, and suddenly learning you were supposed to be trying to get enough points to get the the Worlds of Chaos chapter of the game.

There's also the game's own speed setting for how fast new levels spawn. I haven't really messed with settings other than the default, but I think speeding things up would help out a lot. It wouldn't help with with the lag issues in more involved worlds or the boss fights that are going to take too long regardless of the game's scroll rate.

Run-On: Haste

Just how to present this game was a challenge itself. The screenshots don't do it justice, and a full playthrough video would take hours to complete. I do think the visuals of the levels generated as well as the engines themselves are a sight to behold, so I've decided to include a small video here demonstrating a little gameplay of each world.

Apologies in advance that a small video showing me generally just beating a single level of each world is nearly 14 minutes long. This game, if you have not realized it yet, is very long.

Final Thoughts

I always try to do my best to be positive about the games I play for this series. ZZT games are rarely made by people over 20, and for so many people it was their first time ever programming. Bad games are usually quickly finished, and good games have flaws I'm willing to overlook for things like historical value.

But Run-On was an absolutely struggle to play. It had fun parts! When I died in the angular red/gray world of chaos I called it a night and was looking forward to returning to it, but this game is such a tremendous slog to actually play that I began to loathe my time spent with it. Some of this is due to DOSBox, where clunky keyboard response rates and the eventual inevitable chugging of the engines meant a lot of restarts just to make the game remain playable, but I cannot imagine playing this on native hardware and not being completely and utterly bored more than halfway through.

I've run into slow paced and repetitive games before, namely Commodore's Psychic Solar War Adventure, which coincidentally is also a ZZT world punching above its weight, but that game had charm and care and knew when to quit. WiL's game isn't an "endless" runner, but it sure feels that way. I'm glad he didn't quit when faced with the challenge of randomly generating a ZZT world, but I wish he knew when to quit adding more to it.

I can't deny how impressive Run-On is. It's definitely worth checking it out for a little while, but the moment its shimmer begins to fade, don't hesistate to drop it.


====== A Worlds of ZZT Production ======

The Worlds of ZZT project is committed to the preservation of ZZT and its history.

This article was produced thanks to supporters on Patreon.

Support Worlds of ZZT on Patreon!
Top of Page
Article directory
Main page