Skip to main content

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

  1. Parser (zparser.py)

    • Reads Z-machine story files
    • Parses headers, objects, dictionary
    • Decodes Z-strings and packed addresses
  2. Opcode Decoder (opcodes.py)

    • Decodes all instruction forms (short, long, variable, extended)
    • Handles version-specific opcodes
    • Tracks operands, store variables, and branch targets
  3. 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

z2js-0.1.0.tar.gz (40.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

z2js-0.1.0-py3-none-any.whl (38.8 kB view details)

Uploaded Python 3

File details

Details for the file z2js-0.1.0.tar.gz.

File metadata

  • Download URL: z2js-0.1.0.tar.gz
  • Upload date:
  • Size: 40.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for z2js-0.1.0.tar.gz
Algorithm Hash digest
SHA256 85aed09c122f39e4bb44c61d9525236e69c50baed23a3d3a802f7aebfc5e104d
MD5 d3ef7a31c44c901713138ad0b7ea53fb
BLAKE2b-256 c193ef03370cde7e7e3ea6b4d9233959178141f41ff101685da0dd99755626f4

See more details on using hashes here.

File details

Details for the file z2js-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: z2js-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 38.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for z2js-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 897d5e7182aac783006e1fcd9239d8a34148c812a61924e8e9f725aa21dbf87b
MD5 26a76869da0d475a69aa11b493c28542
BLAKE2b-256 6f28e9f497eeedb4b7fa45d400c0b3982f12f2d1bf9861bb4d59543935452fca

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page