Before Gears, Before Unreal, There Was ZZT

The following is an excerpt from ZZT, Anna Anthropy's upcoming book about Epic boss Tim Sweeney's classic game creation system.


Easy Being An Object

For all the worlds of ZZT I would ultimately explore, it took me a long time to work up the nerve to press the W key, the one labeled "World: TOWN" on the ZZT start-up screen. What could a button labeled "World" possibly do? I was scared, I think, that something fundamental about the world of ZZT would change, some physical constant of the universe rewritten, and the familiar Town of ZZT would be swept away forever. It was the same category of fear as my resistance to running past the end-of-level pipe in stage 1-2 of Super Mario Bros. to get to the secret Warp Zone. I was terrified Mario would be lost forever.

At some point, I built up the courage and hit W. One of ZZT's scroll menus instantly unfurled, listing these choices: TOWN—"The Town of ZZT," TOUR—"Guided Tour ZZT's Other Worlds," and DEMO, "Demo of the ZZT World Editor." World Editor? I selected DEMO, and the screen changed, from Town's bestiary to a white-and-purple screen that read "DEMO — an interactive demonstration of the properties of various items, creatures and terrains in ZZT." Below that: "a guide for budding game designers."

DEMO is a kind of museum, containing exhibits on all of the different pieces that make up ZZT. There's a hall of Items, a chamber of Terrains. There's a two-board-long zoo of Creatures, who prowl behind placards as they wait for you to enter their rooms. Lions, Tigers, Ruffians. Objects?

Before Gears, Before Unreal, There Was ZZT

"Object" was a funny name for a smiley face pacing an invisible cell, the most human-looking thing in the bestiary. What had this person done to be dehumanized into an Object, to be locked up in a zoo with a bunch of faceless animals? Tentatively, I entered the Object room.

Inside is a circus routine of green smiley faces doing tricks. Pacing in a square. Shooting a single spot on the wall, over and over. One stands, doing absolutely nothing, labeled "Idle." And there's one labeled "Interact," smiling and inviting me to come touch it. I did.

"Hi, I'm an object. I can interact
with you by presenting a menu of choices.
What would you like me to do?"

> Give you 1000 bonus points,

> Shoot you three times.

I chose the second option, calling its bluff. Surely the green fellow was just joking around; I had a naive concept of safety in game settings designed for my education and amusement. But Asimov's Laws of Robotics did not apply here: Sure enough, the "you're hurt" sound echoed three times.

"I have just shot you not ONE, not
TWO, but THREE times. Have a nice day."

DEMO was leading me toward an idea that was almost too big to accept, a great chasm of possibility. Objects were the same as the Jazz Man in the House of Blues? The musical buttons he required me to play? I had seen that there was an editor, but I'd assumed that it was only capable of generating "mindless" things, Centipedes and Gems and Boulders, things that operate on instinct, on self-contained logic. I'd imagined that all of the interactions in Town that were so meaningful to me—the Guard in the Armory, the Talking Tree—had been the product of some Real programming language, an arcane vocabulary beyond my understanding or reach.

The editor had created all these creatures? The same editor I see when I press the E key?

Before Gears, Before Unreal, There Was ZZT

Yellow Borders

When you press E, your status bar changes. Where your Ammo, Gems, Torches stores would normally be listed are new categories: "Item," "Creature," "Terrain," "Draw mod," "Pattern," "Color." And there's a new message box, white on red, a sudden inversion of the gentle yellow-and-blue windows you've seen so far. "Room's Title," it says. It wants you to type something in.

You don't know what the fuck to type in; you haven't thought that far ahead. So you jam a bunch of keys and press ENTER, and the box accepts it and goes away, leaving you with the blinking cross-shaped cursor and the Yellow Border.

A box of yellow Normal Walls (walls covered in a pattern of black dots, as opposed to Solid Walls, which are unbroken) around the edge of the screen, the Yellow Border is ZZT's equivalent of the blank page. But it's worse than that because it's not blank. It's something ugly. A box of mottled yellow around the edge of the screen, lacking even the reassuring symmetry of a true square, its vertical sides thicker than its horizontals.

It taunts you. You want to get rid of it because it's hideous, because it doesn't look like the game you want to build—the world you want to create. But you don't know what to replace it with. Yet. What are you making? Do you even know?

You learn to hate the Yellow Border. You learn to hate games that include Yellow Borders in them, because they remind you of your failings. And you learn how to get rid of it as quickly as possible: move the cursor next to it, press ENTER to "pick up" a tile of empty black nothing, move the cursor over the Border, press X to fill it with that nothing. Nothing is so much easier to work with.

Now you need to figure out how to make your first game.

Before Gears, Before Unreal, There Was ZZT

Mad Scientists

Whatever my first ZZT game—or world—was, it never escaped my family's old computer, sealed in the digital tomb of its hard drive.

I think it involved a mad scientist (who would have been named Dr. Something), the stealing of a priceless artifact (maybe a chalice? I had probably seen Indiana Jones), and time travel. The time travel plot leapt into the game halfway through when I got bored of the recover-the-artifact plot. There was a city made of all blue buildings, my imitation of the one where Town of ZZT takes place.

I populated my town with blue people, blue Objects, to mill through the streets like a crowd, but I only knew enough to make them shuffle back and forth on the same rote path, /e/e/e/n/n/n/s/s/s/w/w/w, a town full of people, all of them walking in synchronicity, right right right, up up up, down down down, left left left.

In one of the buildings stood a time machine. Another Dr. waited there, a good scientist, a preserver of order, who told you that the villain has escaped into the past, and if you wanted to follow, well, I suppose you could borrow my time machine. What happens after you leap into the time machine, I can't remember.

I lacked any sense of composition: My screens—or "boards"—were big empty rooms, one step away from the Yellow Borders I started with, with whatever object of significance cold in the center of an enormous black void. Eventually I would become obsessed with making every board as dense as possible by filling the space as completely as I could.

My experiments stayed on that computer, a closed system with no outside input — though I showed my mom one of my games once. The idea that other people might have been making ZZT worlds never occurred to me; the idea that I would actually play those worlds was fully beyond my conception.

Before Gears, Before Unreal, There Was ZZT

ZZT-OOP

ZZT-OOP is the scripting language for ZZT. The OOP stands for "Object-Oriented Programming," the objects in this case being just that: the Objects that danced and sang for me in DEMO.ZZT. ZZT-OOP looks remarkably unlike code, or whatever arcane mystery I thought code must have looked like at nine or ten. An Object's script is built out of a vocabulary of a precious few symbols:

@ indicates an Object's name. An Object's name might be @Francine or @Gun or @toilet. It's like Twitter in a superficial way.

# indicates a command. Like #give gems 200 or #put e purple key or #endgame.

: is a message. Several of these are intrinsic, an inherent part of the game. For example, :touch happens whenever the player's smiley touches the Object, pushes against it. The Object will jump to the part of its script that says :touch and then do whatever it says after it. There's also :shot and :bombed, which respond to Bullets and explosions.

Objects can send themselves messages. For example, I can tell an Object

:loop
#give score 1
#send loop

And it'll just keep giving the player points forever. Or another Object could send that Object a message by using its name.

#send toilet:loop

Text with no symbol at the left of it just tells the Object to display that text. For example, Hello! would display the word "Hello!" in flashing text on the screen for a few seconds. If a message is longer than a single line, one of ZZT's scrolling text boxes will pop up, pausing the game while the player reads.

/ tells an Object to take a step in a direction. /n/n/n means: north, north, north, or "go three steps north." But you can also tell an Object /i—"go idle." Idle is a tool you can use to pace motions and events.

:whimper
#char 1
/i
#char 2
/i
#send whimper

#char changes the Object's character, the text sigil that represents it. The Object above would blink between character 1, the hollow smiley, and character 2, the solid smiley, with a small pause in between frames.

? is like / in that it tells an Object to take a step. If an Object tries to /e, though, and there's something to the east of it, blocking its way, it'll stand there and wait until the thing blocking it has moved. If that's a Solid wall, it'll wait forever. ?e tries to move east, but if it's blocked, the Object forgets about moving east and moves on to the next line in its script.

There are a number of ways Objects are able to move beyond the preset directions of north, south, east, and west. Seek means "toward the player." #shoot seek means "shoot at the player." Opp means the opposite direction: ?opp seek means "step away from the player." Then there's cw and ccw, for clockwise and counter-clockwise. An Object who continually ?cw seek will attempt to run in a circle around the player.

And there are directions that can be used to generate randomness: rndns randomly picks either north or south, rndne picks either north or east, and rndp picks a random direction perpendicular to the direction it's given. For example, ?rndp n would choose east or west.

There's no command to straight-up pick a random direction from the cardinal four, but there's a way to get one anyway: ?rndp rndne will pick a random direction perpendicular to either north or east — meaning either east/west or north/south.

You develop a repertoire of little tricks like this: Push the player away from an Object by #put seek blue boulder and then #change blue boulder empty to get rid of it, use Score to keep track of how many experience points the player has earned. These tricks are all little, but you feel like a genius when you realize you can command the native pieces of ZZT to do your bidding.

I couldn't program, but I could think in terms of simple game pieces and come up with ways to make them interact.

Why ZZT Was the Perfect Game-Making Tool for a Nine-or-Ten-Year-Old Girl

In 2007, Jeremy Penner founded glorioustrainwrecks.com—a site devoted to celebrating expression and creativity in digital games over technical polish, and to empowering everyone to make games with accessible game-making tools. Jeremy makes games with his six-year-old son, Eric.

Jeremy says, "ZZT-OOP is very comfortable with its limitations. Its limitations make it approachable. You have a very small amount of things that you have to learn.

"When you're starting out, you don't approach making a ZZT game by saying, 'Here is the vision of the thing that I want to make; how can I build that with ZZT?' It's much more natural to ask, 'Here are the pieces that ZZT gives me; how can I fit them together in an interesting way?'"

ZZT was perfect for me when I found it—or when it found me—for many reasons.

The limitations of ZZT, for a kid who didn't know how to animate computer graphics or compose digital music, were profoundly liberating. 256 characters in sixteen colors were all I needed and all I would ever need. They are the building blocks of the universe, essential text atoms that are never created or destroyed but merely change their shape. Knowing every shape, every combination of colors, I could conceptualize any possible graphic the editor could produce.

The same is true of sound. Instead of having to learn to make music, to find someone to make music for me, or to find a piece of music I could steal for my game, I could just put a tune together right there in the editor. I would string together random notes—ascending in tone when something good happened or descending when something bad did—and usually it worked. #play 111111 makes a serviceable "door creaking open."

ZZT limited me in the right ways. It also opened up to me in the right ways. ZZT-OOP is capable of so many things way beyond what its creator ever envisioned, complicated machines comprised of systems of Objects all talking to each other, but it was also really well-suited for the simple stories I was trying to tell. Move a thing around a screen, display a message, ask the player a question. ZZT was the perfect theater to act out my confused childhood fantasies, my flailing attempts at self-identity and exploration. Operas where characters of different genders were captured and recaptured, tortured, held, and gratified.

Out of my confusion and dysphoria I was building worlds that moved and spoke, worlds that responded to my touch.

ZZT is published by Boss Fight Books. You can preorder it here.