Skip to main content

No project description provided

Project description

Crimsonland 1.9.93 decompilation + rewrite

This repository is a reverse engineering + high‑fidelity reimplementation of Crimsonland 1.9.93 (2003).

  • Target build: v1.9.93 (GOG "Crimsonland Classic") — see docs/provenance.md for exact hashes.
  • Rewrite: a runnable reference implementation in Python + raylib under src/.
  • Analysis: decompiles, name/type maps, and runtime evidence under analysis/.
  • Docs: long-form notes and parity tracking under docs/ (start at docs/index.md).

The north star is behavioral parity with the original Windows build: timings, RNG, UI/layout quirks, asset decoding, and gameplay rules should match as closely as practical.

Read the full story of how this project came together: reverse engineering workflow, custom asset formats, AI-assisted decompilation, and game preservation philosophy.


Quick start

Install uv package manager.

Run the latest packaged build

If you just want to play the rewrite:

uvx crimsonland@latest

Run from a checkout

gh repo clone banteg/crimson
cd crimson
uv run crimson

Keep runtime files local to the repo

By default, runtime files (e.g. crimson.cfg, game.cfg, highscores, logs, downloaded PAQs) live in your per-user data dir. To keep everything under this checkout:

export CRIMSON_RUNTIME_DIR="$PWD/artifacts/runtime"
mkdir -p artifacts/runtime
uv run crimson

Assets + binaries

There are two separate “inputs” to this repo:

  1. Runtime assets for the rewrite (PAQ archives)
  2. Original Windows binaries for reverse engineering (crimsonland.exe, grim.dll, …)

We keep them out of git and expect a local layout like:

game_bins/
  crimsonland/
    1.9.93-gog/
      crimsonland.exe
      grim.dll
      crimson.paq
      music.paq
      sfx.paq
artifacts/
  runtime/        # optional: where you run the rewrite (cfg/status/paqs)
  assets/         # optional: extracted PAQs for inspection/tools

Running the rewrite

The rewrite loads the assets from original archives:

  • crimson.paq
  • music.paq
  • sfx.paq

Extracted assets

For inspection/diffs/tools, you can extract PAQs into a filesystem tree:

uv run crimson extract crimsonland_1.9.93 artifacts/assets

Same as the original, many loaders can work from either:

  • PAQ-backed assets (preferred when available), or
  • the extracted filesystem layout under artifacts/assets/.

CLI cheat sheet

Everything is exposed via the crimson CLI (alias: crimsonland):

uv run crimson               # run the game (default command)
uv run crimson view ui       # debug views / sandboxes
uv run crimson quests 1.1    # print quest spawn script
uv run crimson config        # inspect crimson.cfg
uv run crimson extract <game_dir> artifacts/assets

Useful flags:

  • --base-dir PATH / CRIMSON_RUNTIME_DIR=... — where saves/config/logs live
  • --assets-dir PATH — where .paq archives (or extracted assets) are loaded from
  • --seed N — deterministic runs for parity testing
  • --demo — enable shareware/demo paths
  • --no-intro — skip logos/intro music

Docs

Docs are authored in docs/ and built as a static site at https://crimson.banteg.xyz/

For development, it's useful to have a live local build:

uv tool install zensical
zensical serve

Development

Tests

uv run pytest

Lint / checks

uv run lint-imports
uv run python scripts/check_asset_loader_usage.py

justfile shortcuts

If you have just installed:

just --list
just test
just docs-build
just ghidra-exe
just ghidra-grim

Reverse engineering workflow

High level:

  • Static analysis is the source of truth.
  • Runtime tooling (Frida / WinDbg) validates ambiguous behavior and captures ground truth.

Contributing notes

  • Keep changes small and reviewable (one subsystem/feature at a time).
  • Prefer measured parity (captures/logs/deterministic tests) over “looks right”.
  • When porting float constants from decompilation, prefer the intended value (e.g. 0.6 instead of 0.6000000238418579 when it’s clearly a float32 artifact).

Legal

This project is an independent reverse engineering and reimplementation effort for preservation, research, and compatibility.

No original assets or binaries are included. Use your own legally obtained copy.

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

crimsonland-0.1.0.dev20.tar.gz (369.9 kB view details)

Uploaded Source

Built Distribution

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

crimsonland-0.1.0.dev20-py3-none-any.whl (467.2 kB view details)

Uploaded Python 3

File details

Details for the file crimsonland-0.1.0.dev20.tar.gz.

File metadata

  • Download URL: crimsonland-0.1.0.dev20.tar.gz
  • Upload date:
  • Size: 369.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for crimsonland-0.1.0.dev20.tar.gz
Algorithm Hash digest
SHA256 b990ec1cc4675abd5ffe9833230b16bc9c7c7151facb1dcea88e69f8e1b42845
MD5 0ecaaaec6f49e60f4cb6846d5b066497
BLAKE2b-256 aacca7235150f501b085afe7dce3b4a4473fc092ebeefe7a087d66c9490ec60f

See more details on using hashes here.

Provenance

The following attestation bundles were made for crimsonland-0.1.0.dev20.tar.gz:

Publisher: release.yml on banteg/crimson

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

File details

Details for the file crimsonland-0.1.0.dev20-py3-none-any.whl.

File metadata

File hashes

Hashes for crimsonland-0.1.0.dev20-py3-none-any.whl
Algorithm Hash digest
SHA256 01ddae990b0ccb5f639e4043ed1c9cc37ecea354e1c294ee6c41f36959a02372
MD5 23bb92ac36e48dd1d57627e82b17bdd3
BLAKE2b-256 9884c0d7e7ef736d92db00af24c5a4609b688d814b75b2d3d50fad486dcb8fa8

See more details on using hashes here.

Provenance

The following attestation bundles were made for crimsonland-0.1.0.dev20-py3-none-any.whl:

Publisher: release.yml on banteg/crimson

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