Retro Game programming with ZZT.
In my day job, I get to design and code software. Sure it’s related to business applications and not the next Dragon Quest or Megaman game, but I like it anyway. Even in my spare time, when I am not reviewing rubbish for the Knock-Off Nerd series, I am sitting at my computer programming away at Objective-C. There are three key moments in my life that lead me to this passion. First and foremost was my introduction to the Commodore Vic-20. Easily my favourite computer and I have a seemingly infinite amount of love for that machine – expect me to write a review on it at some point. The 2nd key moment was when I opened up, what is still ‘till this day one of the greatest Christmas gifts ever – the Nintendo Entertainment System. My mind was forever altered, it was such amazing fun, and I know I am not the only one who feels this way about the NES. No other video game system has had such an impact on me and I doubt one ever will. Once the world of gaming and computing collided, I began to see games in terms of code and functions as well as in terms of entertainment. I immediately set off to replicate some NES games and create new original properties as well on the Vic-20. They were abysmal. I could never get the graphics right. I could program the logic and inputs just fine, but had a hell of a time making the game look nice (even by Vic-20 standards.) Then the 3rd key revealed itself to me – a gaming programming editor that was based on simple ANSI graphics (technically it was ‘code page 437’, but this is hardly important.) Sure the graphics were not as attractive as they were on the NES, but if you got creative, you could make great ASCII/ANSII art that would sit atop a surprisingly powerful Object-Oriented gaming. With the 3rd key in place, I was given a way of making complex and entertaining games with graphics that fit the style of peer games. It was leaps and bounds above what I was accomplishing on the Vic, and this 3rd key was called ZZT.
Let’s rewind back to the 90’s and take a look at ZZT
Now with colour!
In 1991 Epic Mega Games, yes the same Epic Games that would go on to release Unreal Tournament, Infinity Blade and Gears of War, released ZZT for MS-DOS. For those of you that are young enough to have no idea what DOS is, it was the PC operating system prior to Windows. It was known as a command line OS, which basically meant it was a big black screen that you typed commands in to. No graphical interface, no mouse, although no blue screens of death either…
Totally user friendly too…
ZZT eventually had a 3rd party port to Mac OSX, and although I use Mac’s exclusively now, at the time, I was a DOS guy and so my memories of ZZT are firmly intertwined with my time using DOS. ZZT was also made available for Linux, the Sega Dreamcast and even the Nintendo DS at later points in its life cycle and I wouldn’t be surprised to see it on iOS or Android in the future either. The name ‘ZZT’, contrary to popular belief, was not an acronym for anything. It was simply named this way so that it would be guaranteed to appear at the bottom of the listings on newsgroups, where it found its original fame. Again, this was in the early 90s, newsgroups were the way to go if you were online. Once I became aware of ZZT, my weekends were filled with eating peanut butter sandwiches, listening to music and coding in ZZT. Both my brother and I would pretty much takes breaks from ZZT only to play the NES and then take a NES break to code in ZZT once we had a stroke of inspiration. It was a great way to spend the weekend as far as I was concerned.
Town of ZZT – the game that started it all!
Although ZZT is remembered by most of the users, myself included, as a programming editor, technically it was also a gaming platform as it actually included a few games upon launch. These games were a great starting point, much like the original ‘black box’ NES titles, but soon many hobby programmers created games that would surpass the quality of the initial titles. Again, much like how early NES games were surpassed by pretty much anything Capcom and Konami made. The ZZT games included with the engine were ‘City’, ‘Caves’, ‘Dungeons’, ‘Tour’ and the most famous (by ZZT standards) ‘Town’. These games were all ’ top down ‘ view games, much like early RPG’s and adventure games and were somewhat limited both in terms of gameplay and graphics. I won’t lie, I was never all that enthralled with them. In fact I don’t even remember some of these at all. I am not going to spend too much time on the bundled games since the real star of the show here was the editor itself, however the bundled games did give us a baseline to launch forward from and gave us an idea of what was possible. These games all had a ‘generation 1’ vibe to them, relying on built-in enemies and objects as well as black space to represent the walk-able areas.
The bank of ZZT handles all my financial needs. On an unrelated note, have you noticed my Patreon link yet?
So what does the hero of every game look like?
This is what a bad-ass looks like. Would you mess with him?
How about the basic pre-built items and enemies?
Built-in items, terrain, lions, tigers and bears, oh my!
What about the graphics? Well we were limited to the 255 ANSI characters you see below, although we did have a few colours we could select from.
Useable code Page 437 / ANSII character set. You can now see why the ‘happy face’ became the de-facto hero icon.
You would think that a limited character set, limited enemy selection and a fixed hero character graphic would inhibit any creativity and result in games without any depth. However when seen from another perspective, these restrictions acted as standards – they provided users with an immediate understanding of how to play the thousands of games that would eventually call ZZT home. Everything from space shooters, to RPG’s, to adventure games and more all started with the knowledge that this little happy guy was the thing to control. Since the interface as well was fixed, it was also ensured that there was a universal engine and controller scheme that each game (and user) could depend upon.
The interface, while being standard, could not be modified in any way shape or form and was used to indicate your health, ammo and displayed a counter of some of the pre-build items in the game. Also making an appearance in the interface was a help system that illustrated some of the commands you could use, such as pressing [T] to use a torch or pressing [S] to save your game (you could also use a joystick or controller to move and shoot.)
While it was nice to have the ready-made options, most of us would create worlds and settings whereby the concepts of ammo, torches and scores made no sense. Who uses ammo in a medieval setting? What about a space shooter? If I am flying a spaceship, do I really need a torch? What about score? Even in the early 90s gamers had already decided that score in a game didn’t matter anymore.
In addition to the static interface, the pre-made enemies had little variation by today’s standards. They would walk randomly or charge towards the hero and/or shoot bullets. Although you could set the intelligence, speed and firing pattern through the interface, it was limited. However it was soon discovered that by using the programming editor on a custom object we could create custom enemies that would look original, respond to input and even direct commands to other objects. The intelligence could be customized so that enemies could choose to run away if shot or perhaps get more aggressive and increase their firing pattern. We would in essence begin to create artificial intelligence and it did not take long for programmers to move away from the pre-build options and start creating custom items, terrains and enemies.
As ZZT-ers (I am officially calling us that) moved away from the pre-build enemies and began using custom objects, ZZT would begin to enter a second generation of game style.
As mentioned, the second generation of games would use custom objects and custom graphics almost exclusively. This was made all the easier by a freeware tool kit add-on developed by Greg Janson called ‘Super Tool Kit’ and this kit gave us access to new colours and custom objects. It became so important to the community that many ZZT game hosting sites refused to host your game unless you incorporated the new technology.
Some of the new technology in the Super Tool Kit
With the advent of the Super Tool Kit, we could afford to create anything our imaginations desired. My brother created a nice door mechanic that would simulate a door opening and closing rather than simply disappearing when opened (similar to the 1st Dragon Quest on the NES). For the record, I used his door code in every project I ever made. I also created a custom routine to give the illusion of a blood splatter when enemies were shot.
I invented fatalities!
Due to the versatility of the programming language we could not only create new objects and enemies, but also could start to use the pre-built generic items in new and creative ways. As mentioned earlier, torches, score and ammo may not always make the most sense depending on the game setting, but we were unable to remove them from the system, so why not re-purpose torches and score? In the ZZT OOP editor, there existed commands to both GIVE ITEM and TAKE ITEM. There were also commands to repeat a series of commands and test various conditions, such as “how many items are in hand.” For the programmers among us, you likely already see that we have an IF…THEN structure, a Do/While loop as well as the ability to ADD / REMOVE from a variable. These are some of the fundamentals of all programming, and we were learning this as kids.
This character ‘Alien2’ will change to ASCII character 002 and move south and then west a few times. Once finished it will wait for the signal and then execute the function ‘Do2’when triggered and start shooting and moving in all 4 cardinal directions.
To bring it back to the torch or score ‘problem’, we could use the SCORE to represent something else, such as experience points or even a timer. So if I constantly TAKE SCORE 1 and loop every second, I have in effect created a timer that counts down from 1 until the score / timer reaches 0. For RPG fans, we could GIVE SCORE 20 and have the character build experience points when an enemy was defeated. We could then check if the score (experience) is > 200 and have our hero “gain a level”. Every game, while standard in some ways, was also dramatically unique and with the emerging popularity of the Internet, we could freely distribute games that the world could play just like our idols Nintendo and Sega did. Of course sometimes we made a real stinker of a game, but it’s not like all NES games were masterpieces either…
Sorry Matt / LJN Defender but I have to agree with the mob on this one…
Oddly enough it was the limitations of the system that helped forge our creativity and demand us to produce better games. So given the limited characters and colour palette how artistic or creative can someone get?
Sky castle from Fantasy world Dizzy
Overworld for L.O.M.E
Nessboy’s Fantastic Adventure
Burglar! With a great Isometric perspective
O.K. apparently people can get pretty damn artistic.
We in the ZZT community would push and push, introducing elements from the much more powerful NES to ZZT such as a gravity system to transform the game from a top-down view to be a 2D platforming style. All of a sudden we could make a Super Mario game! Some intrepid users invented a pseudo 3D system, while others focused on the details, such as my brother with the door mechanic, myself with the custom blood engine and others replicating NPC type characters and even a party caterpillar system. it truly felt like there was nothing we couldn’t do. Eventually as with everything else, the present becomes the past and ZZT was eventually made obsolete by SuperZZT, Megazeux, RPG Maker and a few other similar creation engines, and while they were all impressive, it was ZZT that I loved.
If you will indulge me in a final thought, I would like to talk about ‘Invasion ZZT’, which was the first game I ever publicly released (under the name antiWare / JPI). It was an alien-abduction adventure game with puzzles and RPG elements. At the time of release it was one of the largest ZZT games ever made, weighing in at over 100K (yes, that was large at the time). The game story was simple – Your dog was kidnapped by Aliens and you and your friends embark on an adventure to get him back. Although it never reached that wide an audience, It was received highly by those that did play it and despite it being a little wordy and preachy, I was very proud of it.
OK… so it was VERY preachy.
If you are interested in giving it a try you can find it here: https://antiware.wordpress.com/ – do keep in mind that this is an old game that I re-published in the year 2000 and as such it is not without it’s flaws.
ZZT was a pretty impressive editor for the time and it was equally impressive just how creative we could get with it. For those that wonder what technology was like ‘back in the day’ – Let me tell you, it was, fun, inspiring, creative and I loved every minute of it!
Now if you will excuse me, I think I’m going to make a sandwich and play a little ZZT 🙂
What do you think? Did you ever experiment with ZZT or a similar game creation engine? Leave a comment and let the nerd army know! Don’t forget to like, share and subscribe and let the word of the nerd be heard!