Skip to main content

Colossal Cave Adventure over Gemini

Project description

Colossal Cave Adventure over Gemini

A faithful port of the classic 350-point Colossal Cave Adventure (Crowther & Woods, 1977) served over the Gemini protocol. Players explore the cave, solve puzzles, and collect treasure — all through a Gemini client.

Built with xitzin (a Gemini web framework) and nauyaca (a Gemini server).

Features

  • Full 350-point game with all rooms, items, puzzles, and encounters from the original
  • Player authentication via Gemini client certificates
  • Per-player game state persisted in SQLite
  • Dwarf and pirate encounters with faithful AI behavior
  • Structured logging with optional fingerprint hashing for privacy

Quickstart

Requires Python 3.13+ and uv.

# Install dependencies
uv sync

# Generate TLS certificates (required for Gemini)
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \
  -days 365 -nodes -keyout key.pem -out cert.pem \
  -subj "/CN=localhost"

# Start the server
ADVENTURE_CERTFILE=cert.pem ADVENTURE_KEYFILE=key.pem uv run adventure

Then connect with any Gemini client to gemini://localhost:1965/.

Configuration

All settings are read from environment variables prefixed with ADVENTURE_:

Variable Default Description
DATABASE_URL sqlite:///./adventure.db SQLite database path
HOST localhost Bind address
PORT 1965 Bind port
CERTFILE Path to TLS certificate (required)
KEYFILE Path to TLS private key (required)
LOG_LEVEL INFO Logging level
LOG_FILE Log to file instead of stdout
JSON_LOGS false Output logs as JSON
HASH_FINGERPRINTS true Hash client fingerprints in logs for privacy

Project Structure

src/adventure/
├── engine/          # Synchronous, pure-Python game logic
│   ├── world.py     # Immutable data structures (Room, Obj, Word, Hint, World)
│   ├── state.py     # Mutable GameState (position, inventory, lamp, dwarves, score)
│   ├── loader.py    # Parses the 12-section advent.dat into a World
│   └── commands.py  # Command dispatch: movement, items, puzzles, combat, scoring
├── routes/          # Xitzin route handlers
│   ├── play.py      # Game routes (require client certificate)
│   └── home.py      # Public pages: /, /help, /about
├── templates/       # Jinja2 .gmi templates for Gemtext responses
├── app.py           # App factory
├── config.py        # Configuration from environment variables
├── logging.py       # structlog setup
├── models.py        # SQLModel entities (Player, SavedGame)
├── session.py       # Load/save/reset game state from DB
└── users.py         # Player upsert by fingerprint
data/
└── advent.dat       # Original game data file

Development

# Run tests
uv run pytest

# Lint and format
uv run ruff check src/ tests/
uv run ruff format src/ tests/

# Type check
uv run ty check src/

Credits

  • Original game: Will Crowther (1976) and Don Woods (1977)
  • Data file format: Public domain
  • Parsing reference: Brandon Rhodes' python-adventure (Apache 2.0)

License

MIT

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

adventure_gemini-0.1.4.tar.gz (49.6 kB view details)

Uploaded Source

Built Distribution

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

adventure_gemini-0.1.4-py3-none-any.whl (55.0 kB view details)

Uploaded Python 3

File details

Details for the file adventure_gemini-0.1.4.tar.gz.

File metadata

  • Download URL: adventure_gemini-0.1.4.tar.gz
  • Upload date:
  • Size: 49.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for adventure_gemini-0.1.4.tar.gz
Algorithm Hash digest
SHA256 47364e26060d2b1b7cf2ec214965d2a57ef0076684124752d329a57e97dbe871
MD5 fb7a0cc9943a5ac118d2ba3f81c93ada
BLAKE2b-256 9569a049ce8c82841c6272bbb09dd99ed6a11da46937658a989dd31986dbc622

See more details on using hashes here.

Provenance

The following attestation bundles were made for adventure_gemini-0.1.4.tar.gz:

Publisher: release-pypi.yml on alanbato/adventure-gemini

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file adventure_gemini-0.1.4-py3-none-any.whl.

File metadata

File hashes

Hashes for adventure_gemini-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 aed5f92ead320667e436c646ab8c114ef07df86f21e2bc001bd0070d580e39dc
MD5 dd00ce2cf15339ea074930d203bf8a10
BLAKE2b-256 6b6e7697a974c87cd141bd655251c9bc4e20b2b76a6ee0e496cc97415812b40a

See more details on using hashes here.

Provenance

The following attestation bundles were made for adventure_gemini-0.1.4-py3-none-any.whl:

Publisher: release-pypi.yml on alanbato/adventure-gemini

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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