Clean-room retro remake: run a paranormal sanitation franchise
Project description
Psychic Cleaners
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).
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b04659871892ccc4a05946ce2d00c0025df1ad3891e0839e8661291cd1e4685b
|
|
| MD5 |
e89326bbeb78bf43e4a5c59648a55b41
|
|
| BLAKE2b-256 |
635c877032dc7d4c37fe9bf1cc3bd48d292a402a2f2cc68952e0bbbebce81659
|
Provenance
The following attestation bundles were made for psychic_cleaners-20260716.2.tar.gz:
Publisher:
publish.yml on DrGeoff/psychic-cleaners
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
psychic_cleaners-20260716.2.tar.gz -
Subject digest:
b04659871892ccc4a05946ce2d00c0025df1ad3891e0839e8661291cd1e4685b - Sigstore transparency entry: 2183727565
- Sigstore integration time:
-
Permalink:
DrGeoff/psychic-cleaners@bf45c929e742beda9a62dd43caae0e79f1df643f -
Branch / Tag:
refs/tags/v20260716-2 - Owner: https://github.com/DrGeoff
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bf45c929e742beda9a62dd43caae0e79f1df643f -
Trigger Event:
release
-
Statement type:
File details
Details for the file psychic_cleaners-20260716.2-py3-none-any.whl.
File metadata
- Download URL: psychic_cleaners-20260716.2-py3-none-any.whl
- Upload date:
- Size: 55.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8668c639c2db34cef19c8d215b1712df7dbda2cb8192c3aa7d2b6054aa9107f
|
|
| MD5 |
82e243d46198675b520fb565f62ff11b
|
|
| BLAKE2b-256 |
8d0d68303cd4a8f5035a6a66457c7b891d511cbd572cfe8820a8c4d0aa68dc78
|
Provenance
The following attestation bundles were made for psychic_cleaners-20260716.2-py3-none-any.whl:
Publisher:
publish.yml on DrGeoff/psychic-cleaners
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
psychic_cleaners-20260716.2-py3-none-any.whl -
Subject digest:
b8668c639c2db34cef19c8d215b1712df7dbda2cb8192c3aa7d2b6054aa9107f - Sigstore transparency entry: 2183727675
- Sigstore integration time:
-
Permalink:
DrGeoff/psychic-cleaners@bf45c929e742beda9a62dd43caae0e79f1df643f -
Branch / Tag:
refs/tags/v20260716-2 - Owner: https://github.com/DrGeoff
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bf45c929e742beda9a62dd43caae0e79f1df643f -
Trigger Event:
release
-
Statement type: