Z-Machine to JavaScript compiler - convert Infocom-style text adventures to playable web games
Project description
z2js - Z-Machine to JavaScript Compiler
A Python compiler that converts Z-machine story files (.z1-.z8) to playable JavaScript that runs in browsers or Node.js.
Features
- Multi-version support: Handles Z-machine versions 1-8
- Browser and Node.js: Generated code works in both environments
- Save/Load: Game state persistence using localStorage (browser) or files (Node.js)
- Interactive HTML UI: Automatically generates a styled HTML wrapper for browser play
- Modular architecture: Clean separation between parser, code generator, and runtime
Installation
pip install z2js
For development or from source, see INSTALL.md.
Usage
Basic compilation
# Compile a Z-machine file to JavaScript
z2js game.z3
# This generates:
# - game.js: The JavaScript runtime and game data
# - game.html: Interactive HTML player interface
Command-line options
# Specify output file
z2js game.z3 -o mygame.js
# Skip HTML generation
z2js game.z3 --no-html
# Verbose output (shows version, serial, etc.)
z2js game.z3 -v
# Show help
z2js --help
Project Structure
z2js/
├── z2js # Main compiler executable
├── zparser.py # Z-machine file parser
├── opcodes.py # Opcode decoder and instruction set
├── jsgen.py # JavaScript code generator
└── test-output/ # Test compilation outputs
Architecture
Components
-
Parser (zparser.py)
- Reads Z-machine story files
- Parses headers, objects, dictionary
- Decodes Z-strings and packed addresses
-
Opcode Decoder (opcodes.py)
- Decodes all instruction forms (short, long, variable, extended)
- Handles version-specific opcodes
- Tracks operands, store variables, and branch targets
-
JavaScript Generator (jsgen.py)
- Generates optimized JavaScript runtime
- Embeds story data as base64
- Creates complete Z-machine interpreter in JavaScript
Runtime Features
The generated JavaScript runtime includes:
- Memory management: Dynamic and static memory regions
- Stack machine: Call stack and evaluation stack
- Object system: Full object tree with attributes and properties
- I/O system: Text output, keyboard input, save/restore
- Z-string decoder: Handles abbreviations and special characters
Supported Games
The compiler has been tested with:
- Zork I-III
- Planetfall
- Enchanter
- Mini-Zork
- Most Inform 6/7 compiled games
Browser Play
Open the generated HTML file in any modern browser:
# After compilation
open game.html # macOS
xdg-open game.html # Linux
start game.html # Windows
Features in the browser interface:
- Retro terminal styling with green-on-black text
- Command history (arrow keys)
- Save/Load buttons
- Restart functionality
- Responsive design
Node.js Usage
Simple - Just run it:
node game.js
The game will automatically start when you run the file directly!
Advanced - Use as a module:
// Load the generated module
const { createZMachine } = require('./game.js');
// Create and run the Z-machine
const zm = createZMachine();
// Set up I/O callbacks
zm.outputCallback = (text) => process.stdout.write(text);
zm.inputCallback = // ... handle input
// Start the game
zm.run();
Technical Details
Z-Machine Versions
| Version | Max Size | Features | Status |
|---|---|---|---|
| 1-2 | 128KB | Basic | ✓ Supported |
| 3 | 128KB | Standard | ✓ Supported |
| 4 | 256KB | Plus | ✓ Supported |
| 5 | 256KB | Advanced | ✓ Supported |
| 6 | 256KB | Graphics | Partial |
| 7 | 320KB | Extended | Partial |
| 8 | 512KB | Large | ✓ Supported |
Opcode Coverage
Currently implements core opcodes for:
- Control flow (call, return, jump, branch)
- Memory access (load, store, loadw, loadb)
- Object manipulation (get/set attributes, insert, remove)
- Text I/O (print, read, output streams)
- Arithmetic and logic operations
- Stack operations (push, pop)
- Game state (save, restore, restart, quit)
Limitations
- Graphics opcodes (V6) are not fully implemented
- Sound effects are stubbed
- Some extended opcodes may not work correctly
- Mouse input not supported
Future Enhancements
- Complete V6 graphics support
- Blorb file support for resources
- Debugger interface
- Optimization passes for generated code
- TypeScript output option
License
This project is for educational purposes. Please respect the copyrights of original game files.
Acknowledgments
Based on the Z-Machine Standards Document v1.1 by Graham Nelson and the work of the Interactive Fiction community.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file z2js-0.2.1.tar.gz.
File metadata
- Download URL: z2js-0.2.1.tar.gz
- Upload date:
- Size: 47.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4baafa303b1957b65f0af990f1c1c1383556656529339d52c3239e4b319e7789
|
|
| MD5 |
cb1e303ae9e39e5d77a4ca96e3a79d91
|
|
| BLAKE2b-256 |
36bf0ac8d53399118f09cfa26fab471dc6de06c14f0c967bb4aa0a4f1b75aa96
|
File details
Details for the file z2js-0.2.1-py3-none-any.whl.
File metadata
- Download URL: z2js-0.2.1-py3-none-any.whl
- Upload date:
- Size: 46.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db6721b71616c71a8f4dcaf0eae4e12afdaa06179e6a1fc8d1f0b4d16431ea15
|
|
| MD5 |
f3d570847d7fb3631175d2eeee617e52
|
|
| BLAKE2b-256 |
5f0420417ee9065449e920ce9bbf3e597f41887fc7311adec8dfc6626ef2a13f
|