Contents
Overview
ZZT is an action-adventure puzzle game and game-creation system for MS-DOS, made by Tim Sweeney and released on January 15, 1991. It is played entirely in text mode: the walls, monsters, keys and doors are all characters from the PC's built-in character set, and you are a white smiley face on a blue background (โป).
What made ZZT special was not any one game. The world editor came in the box, and objects in the world could be given small programs written in a built-in scripting language, ZZT-OOP. Anyone who bought or downloaded ZZT could make their own worlds, share them as a single small file, and have other people play them. For many people it was the first time they made a game, or wrote any code at all.
ZZT is also where a famous company began. Sweeney's company, first called Potomac Computer Systems and later Epic MegaGames, is today Epic Games, the company behind the Unreal Engine.
History
Origins
Tim Sweeney began ZZT in 1989โ90, working from his parents' house in Potomac, Maryland. It started as a text editor written in Turbo Pascal; to make the project more fun he added game-like elements to it, and that grew into ZZT. He sold it under the name Potomac Computer Systems.
The name ZZT does not stand for anything. It was chosen because it would sort last alphabetically in shareware catalogs and on bulletin board file lists.
Shareware
ZZT was distributed as shareware. The first world, Town of ZZT, was free to copy and play. The other official worlds, Caves of ZZT, Dungeons of ZZT and City of ZZT, were sold by mail order. Because the free version already included the editor, players could make and trade their own worlds right away, which is a large part of why ZZT spread.
Epic MegaGames
Around the end of 1991 Sweeney renamed the company Epic MegaGames, a name meant to sound bigger than a one-person business. ZZT's success pushed the company toward publishing shareware games, and Epic grew from there. Super ZZT, a follow-up that uses larger boards which scroll as you move, was also released in 1991 (version 2.0 followed in 1992).
Community, then silence, then revival
Epic moved on to other games, but ZZT's community did not. Fans kept making worlds, traded them on bulletin boards, disks and later the web, and built their own tools. Today the Museum of ZZT collects and preserves the community's worlds. In 2019 the Zeta emulator made ZZT easy to run on modern computers and in browsers.
On March 15, 2020, Adrian Siekierka (the author of Zeta) published the Reconstruction of ZZT: a rebuild of the Turbo Pascal source code of ZZT 3.2 whose output is byte-for-byte identical to the original program. It was released with Tim Sweeney's blessing under the MIT license, which means ZZT's engine and documentation can now be freely used, studied and built on.
How ZZT plays
A ZZT world is a set of boards. Each board is one screen, 60 characters wide and 25 tall, with a sidebar showing your health (you start at 100), ammo, torches, gems, score and the keys you carry. You walk around the board, shoot, solve small puzzles and talk to characters. Boards are connected by passages and by the board edges.
Things you will meet
| Kind | What they do |
|---|---|
| Gems | Collect them for score and a little health. |
| Ammo and torches | Ammo lets you shoot. Some boards are dark, and a torch lights up the area around you for a while. |
| Keys and doors | A key opens the door of the same colour. |
| Scrolls and objects | Touch them to read a message or talk to a character. Objects run ZZT-OOP programs and can do almost anything. |
| Passages | Doors that take you to another board. |
| Energizers | Make you briefly invincible. |
| Boulders, sliders, pushers | Things to push, and things that push back: the building blocks of puzzles. |
| Conveyors, transporters | Move you or the things around you. |
| Water, forests, breakable walls | Water blocks you (but not bullets), forests can be walked through, and breakable walls can be shot away. |
| Lions, tigers, bears, ruffians | Chasers and shooters of different kinds and tempers. Bears wait until you come near. |
| Centipedes and spinning guns | Snakes of linked segments that follow you, and turrets that spin and shoot at you when you line up with them (and in random directions otherwise). |
Keys you press in ZZT
| Key | What it does |
|---|---|
| โ โ โ โ | Move. Walking into an object touches it. |
| Shift + an arrow | Shoot in that direction. |
| Space | Shoot in the direction you last moved. |
| T | Use a torch. |
| P | Pause. Move to carry on. |
| B | Turn the sound on or off. |
| S | Save the game. |
| H | Open the help pages. |
| Esc or Q | Quit (it asks first; answer Y or N). |
| Enter | Choose in menus and message boxes. |
| P W R E S H on the title screen | Play, pick a World, Restore a saved game, open the Editor, change game Speed, see High scores. Also A About and Q Quit. |
| ? | Open the debug console (used for cheating and testing). |
The editor
Pressing E on the title screen opens the board editor. You choose a kind of thing from a menu, pick a colour and a character, and place it on the 60ร25 board. Everything in the game was made this way, including the official worlds, so there is no gap between "playing" and "making": you can open any world, look at how it was built, and change it.
Whole worlds are saved as single .ZZT files, and a saved game is a .SAV file. That made worlds tiny and easy to share. It also made them easy to learn from.
ZZT-OOP
ZZT-OOP (ZZT Object-Oriented Programming) is the small scripting language built into ZZT. You write a program for an object in the editor, and the object runs it as the game plays. Objects can talk, walk, shoot, give or take items, play music, change the board and send messages to each other. Most of ZZT's characters, shops, doors, puzzles and cutscenes are ZZT-OOP programs.
This is a short guide. For every command, the engine details and working recipes, see the ZZT Wiki.
How a program runs
- Every object has a cycle that sets how often it gets a turn (
#CYCLE). On each turn it runs commands from where it left off, one after the other, until it moves, waits, or ends. - A program is a list of lines. What a line does depends on its first character (the table below).
- Objects talk to each other with messages. A message jumps to a label: a line that starts with a colon, such as
:touch. - When the game itself does something to an object, it sends it a system message:
TOUCH(the player walked into it),SHOT(a bullet hit it),BOMBED,THUD(it ran into something) andENERGIZE(the player picked up an energizer; every object gets it). Add a label with that name to react.
Line types
| Line begins with | Meaning |
|---|---|
@name | Gives the object a name so other objects can message it. Must be the first line. |
:label | A label: where a message jumps to. |
#command | A command (see below). |
/direction | Move in that direction (shorthand for #GO). |
?direction | Try to move that way once. If it is blocked, give up for this turn (unlike /direction, which keeps waiting). |
'comment | A note for yourself. It does nothing. |
$text | Centered white text, for titles in a message box. |
!label;text | A clickable choice in a message box. Choosing it sends label. |
| anything else | Plain text, shown to the player as a message (or as a scrolling box when there are several lines). |
Commands
| Command | What it does |
|---|---|
#SEND label | Jump to a label. #SEND name:label messages another object; #SEND ALL:label and #SEND OTHERS:label message every object, or every object but this one. |
#GO direction | Move one step, pushing things out of the way. |
#TRY direction [label] | Move if the way is clear; if blocked, send the optional label. |
#WALK direction | Keep moving that way on every turn until told otherwise. |
#SET flag / #CLEAR flag | Turn a named flag on or off. Flags are yes/no memory for puzzles. |
#IF [NOT] condition [THEN] label | Send a message if a flag or condition is true (or, with NOT, false). |
#GIVE item amount | Give the player AMMO, TORCHES, GEMS, HEALTH, SCORE or TIME. |
#TAKE item amount [label] | Take an item. If the player doesn't have enough, send the optional label instead. |
#SHOOT direction / #THROWSTAR direction | Fire a bullet or throw a star. |
#PUT direction kind | Place a thing on the board next to the object. |
#CHANGE kind kind | Turn every thing of one kind on the board into another. |
#BECOME kind | Turn this object into something else. |
#CHAR number | Change the character the object is drawn with (1โ255). |
#CYCLE number | Set how often the object gets a turn (1 or more; 3 is normal). |
#PLAY music | Play a tune (see below). |
#LOCK / #UNLOCK | Stop or allow incoming messages. |
#ZAP label / #RESTORE label | Switch a label off (turn it into a comment) or back on. |
#BIND name | Share another object's program. |
#IDLE / #RESTART / #END / #DIE | Wait a turn / start the program again / stop running / vanish. |
#ENDGAME | Take away all the player's health. |
Directions and conditions
Directions are N, S, E, W (or NORTH, SOUTH and so on), I (stay), SEEK (toward the player, or away while the player is energized) and FLOW (the direction the object is currently walking, set by #WALK). Modifiers change a direction: CW (clockwise), CCW (counter-clockwise), OPP (opposite), RNDP (a random perpendicular), RNDNS (north or south, at random) and RNDNE (north or east).
Conditions for #IF are ALLIGNED (lined up with the player, spelled that way in the language), CONTACT (touching the player), BLOCKED direction, ENERGIZED, ANY colour thing (for example ANY BLUE KEY), or the name of any flag you have set.
Music
#PLAY takes a string of notes. Letters A to G are notes, X is a rest, # makes a note sharp and ! flat. + and - move up and down an octave. Durations are set by T (32nd), S (16th), I (8th), Q (quarter), H (half) and W (whole), and a . after a duration letter makes the notes that follow it half as long again (q.cde), while 3 makes them triplets. With no duration letter, notes are very short (T). The digits 0 to 9 play drum sounds.
Examples
A sign that talks. The program ends right away and waits; touching it jumps to :touch. The #end after the choices matters: a label line does not stop the message box, so without it the next text would show too. Press โ to the choice, then Enter.
@sign
#end
:touch
$Welcome to the village!
Walk with the arrow keys.
!more;Tell me more
!bye;Goodbye
#end
:more
Gems give you health. Keys open doors.
#end
:bye
Safe travels!
A guard that patrols. It tries to step east three times, then west three times, forever.
@guard
:patrol
?e
?e
?e
?w
?w
?w
#restart
A shopkeeper. It takes five gems and gives a torch, or says what is missing.
@shop
#end
:touch
#take gems 5 short
Thanks! Here is a torch.
#give torches 1
#end
:short
Come back with 5 gems.
A tune. A rising scale in quarter notes.
#play qcdefgab+c
Community and legacy
- Worlds. Thousands of fan-made worlds exist, from tiny experiments to full games. The Museum of ZZT collects, preserves and discusses them.
- Editors. KevEdit, by Kev Vance and Ryan Phillips, is a popular, widely recommended editor.
- Emulation. Zeta by Adrian Siekierka (2019) emulates only the parts of DOS that ZZT needs, which makes ZZT run well in a browser.
- Source. The Reconstruction of ZZT (2020) is the engine's source code under the MIT license.
- Heirs. MegaZeux, by Alexis Janson, began as a ZZT-inspired game-creation system for DOS and is often compared with ZZT.
ZZT's long reach comes from one idea: a game that comes with its own tools and invites you to open it up. A lot of people who now make games, or software, remember ZZT as where they started.
About ZZTboii
ZZTboii is a way to play real ZZT on your phone. It runs the original ZZT 3.2 engine, via the Zeta emulator and the Reconstruction of ZZT, inside your browser. Nothing is installed and nothing is uploaded: your saved games stay in your browser on your device.
On an iPhone, open ZZTboii in Safari, tap Share, then Add to Home Screen. It then opens like an app and works offline, because everything it needs is downloaded to your phone the first time.
Phone controls
ZZT was made for a keyboard, so ZZTboii has an on-screen keyboard with a button for every key you might press. It has three pages, chosen with the tabs under the screen.
| Page | What is on it |
|---|---|
| Play | Two thumb pads: the left one moves, the red one on the right shoots in the direction you press (this is Shift + arrow). Slide your thumb across a pad to change direction without lifting it. Below them: Esc, Enter, Space, and the keys ZZT uses: Torch, Pause, B sound, Save, Restore, World, Help, Quit, Yes, No, ? and a one-tap Load. |
| Keys | A full keyboard for typing save names, cheats and editor commands. โง Shift, Ctrl and Alt are sticky: tap once to use them for the next key only, tap twice to lock them on. |
| More | F1โF10, Home, End, PgUp, PgDn, Ins, Del, Tab, plus extra arrows. |
The View button switches between the board, the sidebar and the whole screen, and โฐ opens the menu. Turn your phone sideways and the board fills the screen with the keys floating over it. ZZT shows its prompts, such as "Save asโฆ" and "End this game?", in the sidebar, so ZZTboii shows the sidebar for a moment when you press those keys.
The keyboard is a separate module driven by a plain list of keys, so the same keyboard can be reused for other simple DOS games later.
Games you can play here
- Lighthouse by Claude & y2kmallrat.com, 2026
Light the lamp before the fisherman's boat is lost. A small adventure in five boards. - Metal Saviour Bia by Agent Orange, 2020
A shoot-'em-up through a glowing tunnel. Use the red pad to fire. Museum of ZZT page - Winter by myth, 1999
A quiet, atmospheric journey. Featured on the Museum of ZZT. Museum of ZZT page - War-Torn by Madguy, 1998
A moody war adventure. Featured on the Museum of ZZT. Museum of ZZT page - The Mask of Cortez by David Bishop, 1993
A bold early adventure with a big colourful title screen. Museum of ZZT page - Dogfight by Barney9651 & Yenrab, 1995
Air combat over the clouds. Use the red pad to fire. Museum of ZZT page - Land of ZZT by Ethan Fleischer, 1993
A classic ZZT adventure, version 2.0. Museum of ZZT page - Svynar's Quest by Lincoln Sayger & Tony Sayger, 1999
A 53-board fantasy quest. Museum of ZZT page - Preposterous Machines by Drake Wilson, 2009
A ZZT tech showcase: tiny working machines built from objects. Museum of ZZT page - Anthropoid by Nuero (Random Inc.), 2001
A three-part action adventure. Contains strong language. Museum of ZZT page
Every game belongs to its author, and each one is included with the author's permission, or under the licence stated in the game's own files.
Further reading
- The ZZT Wiki on this site: every ZZT-OOP command, tested in the real engine, with a cookbook of working examples.
- ZZT on Wikipedia
- ZZT Wiki (wiki.zzt.org): the community's reference, including every ZZT-OOP command.
- About ZZT, at the Museum of ZZT
- The ZZT-OOP language reference, from the original manual.
- Reconstruction of ZZT and Zeta