Skip to main content

Clean-room retro remake: run a paranormal sanitation franchise

Project description

Psychic Cleaners

Build Status Coverage

A clean-room pygame-ce homage to a 1984 Activision C64 classic about running a paranormal-removal franchise: buy a vehicle and gear, watch the city map, drive to hauntings, snare stain-ghosts between two beams, dodge a rampaging gummy mascot, and — when the city's psychic residue maxes out — storm Threshold Tower. Mechanics and pacing follow the original; every name, sprite, sound, and melody is an original work. The full concept-by-concept theme mapping is in docs/superpowers/specs/2026-07-13-psychic-cleaners-design.md (section 3).

City map with the Depot, a wisp, haunted buildings, and the HUD Busting a stain-ghost between two beam-cleaners

Every sprite, sound, and melody shown above is generated in code at startup — no image or audio assets ship in this repo (see shell/gfx.py and shell/audio.py).

Provenance

This project is 100% vibe coded: no human looked at the game itself — played it, watched it run, or reviewed a screenshot — until it was published as v20260716-1. All design, implementation, and verification up to that point were done by an AI agent operating this repository end to end (specs, plans, tests, the scripted playtest harness, and CI), with the human author directing scope and reviewing written artifacts (specs, plans, diffs) rather than the running game.

Install

Requires Python >= 3.14 and uv.

uv sync

Play

uv run psychic-cleaners

Win condition: end the finale with a bankroll strictly greater than the one you started with. Your account code carries the bankroll into the next game.

Controls

Scene Keys
Title Type your name; Tab switches between the Name and Account code fields; Backspace deletes; Enter confirms (blank code = new franchise, filled code = restore account)
Shop Up/Down select; Enter buy vehicle or item; F finish shopping
City map Arrow keys move the cursor; Enter travel; B deploy gummy bait on an alert; S buy a snare at the Depot; L take a Depot loan; P repay a Depot loan
Driving Up/Down change lane; B deploy gummy bait on an alert
Busting Left/Right move cleaner or snare cursor; Enter place / lay snare; Space spring it; B deploy gummy bait on an alert
Finale Space send the next runner past the mascot
Game over Enter back to the title

Development

uv run pytest                 # full suite (SDL dummy drivers set by tests/conftest.py)
uv run ruff check .           # lint
uv run ruff format .          # format
uv run mypy                   # strict type-check of src and tests
uv run pre-commit install     # ruff + mypy on every commit

CI additionally enforces >= 90% coverage on the pure-logic core: uv run pytest --cov=psychic_cleaners.core --cov-fail-under=90 --override-ini="addopts=--cov-report=term-missing" (the override drops the package-wide --cov from pyproject addopts so the gate measures core/ only).

Project layout

src/psychic_cleaners/
  core/    # pure deterministic game logic — zero pygame imports
           # constants.py is the single tuning point for every gameplay number
  shell/   # all pygame-ce code: app loop, generated sprites/audio, one module per scene
tests/
  core/         # fast unit + Hypothesis property tests
  integration/  # scripted full-playthrough tests of core.game (no pygame)
  shell/        # SDL dummy-driver smoke tests

The shell feeds Command objects into core.game.Game.tick, which returns Event objects; the shell draws state and plays a sound per event. Same seed + same commands = same game, which is what makes the playthrough tests deterministic.

License

Public domain — see LICENSE (The Unlicense).

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

psychic_cleaners-20260716.2.tar.gz (309.2 kB view details)

Uploaded Source

Built Distribution

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

psychic_cleaners-20260716.2-py3-none-any.whl (55.3 kB view details)

Uploaded Python 3

File details

Details for the file psychic_cleaners-20260716.2.tar.gz.

File metadata

  • Download URL: psychic_cleaners-20260716.2.tar.gz
  • Upload date:
  • Size: 309.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for psychic_cleaners-20260716.2.tar.gz
Algorithm Hash digest
SHA256 b04659871892ccc4a05946ce2d00c0025df1ad3891e0839e8661291cd1e4685b
MD5 e89326bbeb78bf43e4a5c59648a55b41
BLAKE2b-256 635c877032dc7d4c37fe9bf1cc3bd48d292a402a2f2cc68952e0bbbebce81659

See more details on using hashes here.

Provenance

The following attestation bundles were made for psychic_cleaners-20260716.2.tar.gz:

Publisher: publish.yml on DrGeoff/psychic-cleaners

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

File details

Details for the file psychic_cleaners-20260716.2-py3-none-any.whl.

File metadata

File hashes

Hashes for psychic_cleaners-20260716.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b8668c639c2db34cef19c8d215b1712df7dbda2cb8192c3aa7d2b6054aa9107f
MD5 82e243d46198675b520fb565f62ff11b
BLAKE2b-256 8d0d68303cd4a8f5035a6a66457c7b891d511cbd572cfe8820a8c4d0aa68dc78

See more details on using hashes here.

Provenance

The following attestation bundles were made for psychic_cleaners-20260716.2-py3-none-any.whl:

Publisher: publish.yml on DrGeoff/psychic-cleaners

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