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.2.tar.gz (49.1 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.2-py3-none-any.whl (48.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: z2js-0.2.2.tar.gz
  • Upload date:
  • Size: 49.1 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.2.tar.gz
Algorithm Hash digest
SHA256 21010e72bceb69ab54cb096f41cbbcf2eee0eab6543d2428279311f5414fd7ed
MD5 24a3b36f5ad678e72835974ec0be82f8
BLAKE2b-256 d447ed5a066a804b7a8fc3d4da2a631ba68bcf84af404accb940010b35fed8d1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: z2js-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 48.2 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b9a36e61d79c8319a5bc19cd4488e76494040fd4cc07bc845594c1ddbbbbbc1f
MD5 a54a5f4090b1ebb22099b606e649763a
BLAKE2b-256 15b5ba912dcf44a8ea2d46a0457e6219c5d5f00793578ccd437b61f9cc7327c7

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