EZZT -- The ZZT Enhancer

This page exists to allow people to download Craig Boston's old ZZT Enhancer beta. You also need a copy of ZZT 3.2 -- in the readme, Craig states that he doesn't know whether or not it would work with another version, but the way it works makes that extremely unlikely.

Note: I've never gotten EZZT to run with sound enabled on anything besides real DOS or Windows 9x with a SoundBlaster (though I'm sure it works fine with a Gravis Ultrasound or Pro Audio Spectrum-compatible card as well, I've just never had one of those to try it with). Trying with ntvdm (that is, the DOS box on Windows XP) and VDMSound just now, I only managed to get a SIGSEGV in ENHANCER.EXE.

It does, however, appear to run just fine in ntvdm with sound disabled.

The ZZT Enhancer uses DJGPP along with the Virtual 8086 (aka V86 or VM86) mode of i386 processes to load ZZT into memory and then "hook" it at various points, such as the ZZT-OOP interpreter.

It supports:

    • Packaging game-related resources into an archive file, e.g. caverns.cer

    • Playing music in various .MOD-like formats using MikMod

    • Loading custom screen fonts, a la Megazeux

    • Each game may include a dynamically-loaded COFF file with x86 executable code, e.g. caverns.dlm in the Caverns demo. This is implemented using the DJGPP add-on package dll-940219.zip, found in the beta/ directory of any full DJGPP mirror (e.g. https://delorie.com/pub/djgpp/beta/).

The Caverns demo also uses bitmapped graphics, but I'm not yet sure whether that is implemented in caverns.dlm or in enhancer.exe.

Unfortunately, no tools are provided to use EZZT in a game of your own, and EZZT will in fact refuse to operate if run with a modified .zzt file.

On the bright side, EZZT includes a full symbol table (including those for names with static scope), so it should be relatively easy to reverse, especially if the version of MikMod that it uses can be identified, along with whatever other libraries besides MikMod and the dll package it may use. The many C++-mangled names, which include the types of arguments a method/function accepts, should make this even easier.