Tired of smiling all the time? Always feeling (white on) blue? ZZT's rigid graphics getting in the way of your masterpiece? If so, this may be the guide for you.
ZZTers have been pushing the limits of ZZT's graphics from pretty much the very beginning. Over the years non-ZZT specific DOS utilities were discovered and made use of to create alternate character sets, palettes, and to stop that darned blinking. While there are some pretty significant benefits to ZZT's incredibly abstract visuals allowing for many interpretations of the same character, sometimes you just wish you could have some graphics that are actually shaped like the item they're intended to be.
This article will get you started on making these modifications for your own ZZT worlds. You'll learn of the modern tools used to create these graphical modifications, how to create worlds with them active, and how to play worlds that make use of custom charsets and palettes. Then, for the sake of completion (and to be able to retire a similar article from 2011,) a brief overview of the tools used in the past to perform the same modifications.
Creating Modern Custom Character Sets (.CHR) and Palettes (.PAL)
In what can only be described as some form of cosmic irony, the tool of choice for creating character sets and palettes is none other than the ZZT clone MegaZeux. MegaZeux has had its own tools for customizing charsets and palettes from its editor since practically forever. These tools are easy to use, support mouse inputs, and export to two straightforward formats that work are supported by the Zeta emulator for ZZT and major ZZT forks including Weave ZZT and ClassicZoo. Rather than reinvent the wheel and the... wheel making thing, the ZZT community has adopted these formats as well.
Of course, MegaZeux contains far more than a charset and palette editor, so you'll need to get to the relevant portion of the program first.
- Launch MegaZeux - The latest version can be acquired from DigitalMZX with support for a number of OSes.
- The world menu will open automatically. Press ESCAPE or click Cancel to close it so as not to edit an existing MegaZeux world.
- Press E to open the MegaZeux editor.
- You'll then be prompted to name the first board. Whatever you enter here does not matter, including just pressing ESCAPE for a blank title.
Creating Character Sets
To open the MegaZeux character editor press ALT+C. Controls are displayed on screen, but a few are worth highlighting here to get started:
- ↑↓←→ - Move the cursor in the specified direction
- SPACE - Toggle the selected pixel on/off
- ENTER - Brings up a character selection screen rather than having to move character-by-character through the charset.
- H - Shows additional commands.
- F1 - Brings up the Character Editor Help document.
- F4 - Reverts the selected character to the default ASCII character, making it match the standard charset used by ZZT.
Unlike ZZT, MegaZeux's support for mouse input is far more robust, allowing you to draw with the mouse as well as simply clicking on options and buttons rather than tabbing between them and having to use a keyboard to confirm choices. Use what works best for you!
The character editor in MegaZeux offers a number of useful features that can be learned about from MegaZeux's own help files. These include drawing pixels rather than plotting them, copying/pasting blocks of pixels/characters, and editing multiple characters simultaneously among others. Don't hesitate to press F1 and learn some tricks to speed up development!
Keep in mind though that MegaZeux supports several more complex operations with its character sets that do not work with ZZT. You are still limited to 256 characters, there are no "partial charsets", and "Super MZX modes" do not apply. Only a basic full character set may be used.
Once your character set is ready, press ESCAPE to close out the character editor (the export function from within the character editor is designed to export individual characters with the set). Next, press ALT+X to open the export menu. Choose Character set (CHR) and confirm with ENTER. A file dialog will open allowing you to name your character set. Input a name, and press ENTER to save it. The default offset and size values map to a full character set and will always be the correct values for a ZZT compatible character set.
Creating Palettes
To open the MegaZeux palette editor press ALT+E. As with character sets, the controls are shown on screen.
- ←→ - Select color to edit
- R/G/B - Increase Red/Green/Blue component
- ALT+R/G/B - Decrease Red/Green/Blue component
- A - Increase All components
- ALT+A - Decrease All components
- ALT+D - Restore all colors to the default values
The mouse can again be used to great effect, clicking colors to select them as well as to click and drag the sliders the make up the current color's components. By default, the editor uses RGB components, but both HSL and CIELAB are available as well.
When your palette is complete, press ALT+X to export the palette to a file. (You may also export the palette from the main editor window after closing the palette window similar to how you would a character set.) A file dialog will open allowing you to name your character set. Input a name, and press ENTER to save it.
Disabling Blinking Colors
The video settings ZZT runs under by default prevent it from producing characters with high-intensity backgrounds (bright colors). Instead, these colors cause the element to blink. Which option is preferable depends on what you're looking to create.
Zeta
A command-line argument can be passed to Zeta to disable blinking automatically.
zeta86(.exe) -b
Additionally, more recent versions of Zeta include an options menu that can be accessed with F11. One such option is whether or not to allow blinking.
ClassicZoo
ClassicZoo supports adjusting blinking settings from within the program itself. On the title screen of any world, press A to open the Options/About menu. Under the Frontend category you'll find options to specify an alternate character set or palette. Selecting one of these will list the relevant files in the current directory. Another option under the same category makes it easy to toggle blinking colors.
You can also modify whether or not blinking colors are enabled via the cheat prompt accessible with ?. On this prompt enter BLINK to enable blinking or NOBLINK to disable it.
Creating Worlds Using Modern Character Sets (.CHR) and Palettes (.PAL)
Once you have your palette and/or character set created, you'll want to be able to work on your ZZT world with those custom graphics active. The method for loading these files varies between ZZT editors. Below are instructions for the most popular third-party editors.
KevEdit
As of KevEdit version 1.2.0 (released in March of 2023), the program officially supports custom character sets.
With your world opened, press W to open the World Information window. Near the very bottom of the list are Character Set and Palette options. Press ENTER on them and a list of .CHR or .PAL files will be presented in the current directory. Select one and it will be used throughout KevEdit.
Non-DOS builds of KevEdit have blinking disabled with no way to enable it.
zedit2
zedit2 has supported custom character sets for many (all?) releases, but hey, now's a great time to see if you're running an old version and update to the latest if so.
With your world opened, click on the World dropdown menu. From there select Load Charset or Load Palette to bring up a list of relevant files in the current directory. Select one and it will be used when drawing boards.
This same menu also has a checkbox to toggle whether or not blinking is currently enabled.
Misc. Notes
- Custom character sets and palettes do not modify .ZZT files themselves. You will need to manually load your charsets and palettes every time you launch your editor of choice.
- For KevEdit users, changes to the charset and palette apply to the entire program. You can make the UI a bit difficult to comprehend if you replace certain characters or colors.
- For zedit2 users, the character set and palette do not impact the UI in this way. Modified characters used in object code will be displayed in their original form. The character selection interface does show the expected modified character, but be aware if you're trying to do some detailed drawings in an object's text!
Playing Worlds With Modern Custom Character Sets and Palettes
Lastly, of course, you'll need a way for people (yourself included!) playing your game to be able to use your modified graphics. While you should include some way for users to launch your world with minimal setup, you should also be sure to mention the expected settings in a text file accompanying your world.
Zeta
It's possible to pass a charset to the Zeta emulator directly, and use it automatically with any worlds loaded. From a command prompt you'll want to run Zeta with additional arguments.
zeta86(.exe) -l charset.chr -l palette.pal
Replace the filenames with the name of your character set and/or palette. Zeta will then apply them to any worlds.
When distributing ZZT worlds that use charsets, it's best to place this command a batch file or shell script to execute your world with the proper settings automatically rather then ask users to do so by hand every time.
ClassicZoo
ClassicZoo supports loading custom character sets and palettes from within the program itself for native SDL builds. On the title screen of any world, press A to open the Options/About menu. Under the Frontend category, options exist to specify the current charset and palette. Selecting one of these will list the relevant files in the current directory.
Misc. Notes
- The -l argument with just a filename will make Zeta guess as to the format of the passed file. If you're using standard extensions and modern formats, this should be sufficient, but you can also specify the type of asset to load as well as the format it uses with a more detailed argument such as: zeta86(.exe) -l charset:chr:<charset.chr>
Creating Legacy Custom Character Sets (.COM) and Palettes (.PLD)
Short answer: Don't.
Longer answer: No. Really. Please just use MegaZeux and work with the modern formats. Unless you are for whatever reason working exclusively on retro PC hardware, you'll be better off using the methods listed previously.
Historically, the ZZT community used a utility called Font Mania for MS-DOS. It will not run on modern systems with an MS-DOS emulator. Fonts created with Font Mania need to be set to a height of fourteen pixels for use with ZZT, and should be exported as a .COM file.
For palettes, the program used was upal, another MS-DOS program. This exports palettes in a different format, producing .PLD files.
Lastly, a third MS-DOS program Blink X can be used to disable blinking-colors and use high-intensity color backgrounds instead.
Of these modifications, only custom character sets ever saw much use. Upal and Blink X were not known to the wider ZZT community for many years. However, running ZZT in a window rather than in fullscreen on certain versions of Microsoft Windows would display blinking background colors as high-intensity backgrounds instead. A few games may have documentation asking to run ZZT in a window for this purpose. Some may not mention it, but can be assumed to have been designed to be ran with bright background colors due to peculiar use of blinking colors.
Playing Worlds with Legacy Custom Character Sets and Palettes
Traditionally worlds that used special graphical modifications came bundled with a .BAT file to handle the setup automatically. If you are using older hardware just running the batch file should do everything for you. Usually these batch files just consist of the following lines, sometimes with additional lines to turn off echoing commands or to print a message after ZZT has been closed.
font.com i
zzt.exe
font.com u
The i and u arguments are used to tell the file whether to install the font to memory or uninstall it from memory.
To load a Upal generated PLD palette:
upal.exe palette.pld
zzt.exe
At a glance, it seems Upal has no way to restore the default palette. You may want to export a PLD file of the default palette to load later.
To use Blink X:
blinkx.com
zzt.exe
Blink X also seems to lack an ability to easily disable it after activating.
These commands should also apply to MS-DOS versions of KevEdit for those editing ZZT worlds on legacy hardware. They can be combined into a single batch file containing every command to apply charset/palette/blinking changes.