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.2.0.tar.gz (47.6 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.2.0-py3-none-any.whl (46.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for z2js-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9b436ab2724f42f747a15664873e036e800e030ce8e9f81ac50b9cbaef84bd57
MD5 9aae4949c90fe6e2d4b19494b7c2e8c0
BLAKE2b-256 082760f1bbbdf39d6d9fcb11d4cec7e91f2873faad50c3e31fbc95051395dffe

See more details on using hashes here.

File details

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

File metadata

  • Download URL: z2js-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 46.6 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.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3b059b5fcacbc2d67b6d3e4793b1d5f19a20c38f24443d03fad76306b08317ee
MD5 29af37e5c90f328347856732352a45d2
BLAKE2b-256 d7524afdf11272e202518a8f2d76b7ac9df80cc7f91af73787da0e11f62dff2e

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